@openvtc/trust-tasks 0.22.5 → 0.22.7

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.
Files changed (199) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/dist/_shared/components.d.ts +434 -1
  3. package/dist/_shared/components.d.ts.map +1 -1
  4. package/dist/acl/_shared/0.1/acl-entry.d.ts +1 -1
  5. package/dist/acl/_shared/0.1/acl-entry.d.ts.map +1 -1
  6. package/dist/acl/_shared/0.2/acl-entry.d.ts +22 -0
  7. package/dist/acl/_shared/0.2/acl-entry.d.ts.map +1 -0
  8. package/dist/acl/_shared/0.2/acl-entry.js +6 -0
  9. package/dist/acl/_shared/0.2/acl-entry.js.map +1 -0
  10. package/dist/acl/change-role/0.1/payload.d.ts +1 -1
  11. package/dist/acl/change-role/0.1/payload.d.ts.map +1 -1
  12. package/dist/acl/change-role/0.2/payload.d.ts +1679 -0
  13. package/dist/acl/change-role/0.2/payload.d.ts.map +1 -0
  14. package/dist/acl/change-role/0.2/payload.js +955 -0
  15. package/dist/acl/change-role/0.2/payload.js.map +1 -0
  16. package/dist/acl/grant/0.1/payload.d.ts +1 -1
  17. package/dist/acl/grant/0.1/payload.d.ts.map +1 -1
  18. package/dist/acl/grant/0.2/payload.d.ts +1649 -0
  19. package/dist/acl/grant/0.2/payload.d.ts.map +1 -0
  20. package/dist/acl/grant/0.2/payload.js +942 -0
  21. package/dist/acl/grant/0.2/payload.js.map +1 -0
  22. package/dist/acl/list/0.1/payload.d.ts +1 -1
  23. package/dist/acl/list/0.1/payload.d.ts.map +1 -1
  24. package/dist/acl/list/0.2/payload.d.ts +1853 -0
  25. package/dist/acl/list/0.2/payload.d.ts.map +1 -0
  26. package/dist/acl/list/0.2/payload.js +1041 -0
  27. package/dist/acl/list/0.2/payload.js.map +1 -0
  28. package/dist/acl/revoke/0.1/payload.d.ts +1 -1
  29. package/dist/acl/revoke/0.1/payload.d.ts.map +1 -1
  30. package/dist/acl/revoke/0.2/payload.d.ts +1844 -0
  31. package/dist/acl/revoke/0.2/payload.d.ts.map +1 -0
  32. package/dist/acl/revoke/0.2/payload.js +1052 -0
  33. package/dist/acl/revoke/0.2/payload.js.map +1 -0
  34. package/dist/acl/show/0.1/payload.d.ts +1 -1
  35. package/dist/acl/show/0.1/payload.d.ts.map +1 -1
  36. package/dist/acl/show/0.2/payload.d.ts +1689 -0
  37. package/dist/acl/show/0.2/payload.d.ts.map +1 -0
  38. package/dist/acl/show/0.2/payload.js +968 -0
  39. package/dist/acl/show/0.2/payload.js.map +1 -0
  40. package/dist/acl/swap-key/0.1/payload.d.ts +1 -1
  41. package/dist/acl/swap-key/0.1/payload.d.ts.map +1 -1
  42. package/dist/acl/update/0.1/payload.d.ts +1 -1
  43. package/dist/acl/update/0.1/payload.d.ts.map +1 -1
  44. package/dist/acl/update/0.2/payload.d.ts +1784 -0
  45. package/dist/acl/update/0.2/payload.d.ts.map +1 -0
  46. package/dist/acl/update/0.2/payload.js +1005 -0
  47. package/dist/acl/update/0.2/payload.js.map +1 -0
  48. package/dist/auth/signing-key/authorize/0.1/payload.d.ts +199 -0
  49. package/dist/auth/signing-key/authorize/0.1/payload.d.ts.map +1 -0
  50. package/dist/auth/signing-key/authorize/0.1/payload.js +108 -0
  51. package/dist/auth/signing-key/authorize/0.1/payload.js.map +1 -0
  52. package/dist/auth/signing-key/enroll/0.2/payload.d.ts +569 -0
  53. package/dist/auth/signing-key/enroll/0.2/payload.d.ts.map +1 -0
  54. package/dist/auth/signing-key/enroll/0.2/payload.js +315 -0
  55. package/dist/auth/signing-key/enroll/0.2/payload.js.map +1 -0
  56. package/dist/auth/step-up/approve-request/0.4/payload.d.ts +672 -0
  57. package/dist/auth/step-up/approve-request/0.4/payload.d.ts.map +1 -0
  58. package/dist/auth/step-up/approve-request/0.4/payload.js +373 -0
  59. package/dist/auth/step-up/approve-request/0.4/payload.js.map +1 -0
  60. package/dist/auth/step-up/approve-response/0.6/payload.d.ts +974 -0
  61. package/dist/auth/step-up/approve-response/0.6/payload.d.ts.map +1 -0
  62. package/dist/auth/step-up/approve-response/0.6/payload.js +552 -0
  63. package/dist/auth/step-up/approve-response/0.6/payload.js.map +1 -0
  64. package/dist/auth/step-up/approver/_shared/0.1/approver.d.ts +16 -0
  65. package/dist/auth/step-up/approver/_shared/0.1/approver.d.ts.map +1 -0
  66. package/dist/auth/step-up/approver/_shared/0.1/approver.js +6 -0
  67. package/dist/auth/step-up/approver/_shared/0.1/approver.js.map +1 -0
  68. package/dist/auth/step-up/approver/attest/0.1/payload.d.ts +174 -0
  69. package/dist/auth/step-up/approver/attest/0.1/payload.d.ts.map +1 -0
  70. package/dist/auth/step-up/approver/attest/0.1/payload.js +97 -0
  71. package/dist/auth/step-up/approver/attest/0.1/payload.js.map +1 -0
  72. package/dist/auth/step-up/approver/enroll/0.1/payload.d.ts +503 -0
  73. package/dist/auth/step-up/approver/enroll/0.1/payload.d.ts.map +1 -0
  74. package/dist/auth/step-up/approver/enroll/0.1/payload.js +285 -0
  75. package/dist/auth/step-up/approver/enroll/0.1/payload.js.map +1 -0
  76. package/dist/auth/step-up/approver/invite/0.1/payload.d.ts +375 -0
  77. package/dist/auth/step-up/approver/invite/0.1/payload.d.ts.map +1 -0
  78. package/dist/auth/step-up/approver/invite/0.1/payload.js +200 -0
  79. package/dist/auth/step-up/approver/invite/0.1/payload.js.map +1 -0
  80. package/dist/auth/step-up/approver/list/0.1/payload.d.ts +477 -0
  81. package/dist/auth/step-up/approver/list/0.1/payload.d.ts.map +1 -0
  82. package/dist/auth/step-up/approver/list/0.1/payload.js +272 -0
  83. package/dist/auth/step-up/approver/list/0.1/payload.js.map +1 -0
  84. package/dist/auth/step-up/approver/redeem/finish/0.1/payload.d.ts +512 -0
  85. package/dist/auth/step-up/approver/redeem/finish/0.1/payload.d.ts.map +1 -0
  86. package/dist/auth/step-up/approver/redeem/finish/0.1/payload.js +290 -0
  87. package/dist/auth/step-up/approver/redeem/finish/0.1/payload.js.map +1 -0
  88. package/dist/auth/step-up/approver/redeem/start/0.1/payload.d.ts +343 -0
  89. package/dist/auth/step-up/approver/redeem/start/0.1/payload.d.ts.map +1 -0
  90. package/dist/auth/step-up/approver/redeem/start/0.1/payload.js +187 -0
  91. package/dist/auth/step-up/approver/redeem/start/0.1/payload.js.map +1 -0
  92. package/dist/auth/step-up/approver/revoke/0.1/payload.d.ts +534 -0
  93. package/dist/auth/step-up/approver/revoke/0.1/payload.d.ts.map +1 -0
  94. package/dist/auth/step-up/approver/revoke/0.1/payload.js +301 -0
  95. package/dist/auth/step-up/approver/revoke/0.1/payload.js.map +1 -0
  96. package/dist/index.d.ts +33 -0
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +33 -0
  99. package/dist/index.js.map +1 -1
  100. package/dist/task-consent/decision/0.2/payload.d.ts +775 -0
  101. package/dist/task-consent/decision/0.2/payload.d.ts.map +1 -0
  102. package/dist/task-consent/decision/0.2/payload.js +450 -0
  103. package/dist/task-consent/decision/0.2/payload.js.map +1 -0
  104. package/dist/vtc/admin/actions/_shared/0.1/action.d.ts +24 -0
  105. package/dist/vtc/admin/actions/_shared/0.1/action.d.ts.map +1 -0
  106. package/dist/vtc/admin/actions/_shared/0.1/action.js +6 -0
  107. package/dist/vtc/admin/actions/_shared/0.1/action.js.map +1 -0
  108. package/dist/vtc/admin/actions/acknowledge/0.1/payload.d.ts +1012 -0
  109. package/dist/vtc/admin/actions/acknowledge/0.1/payload.d.ts.map +1 -0
  110. package/dist/vtc/admin/actions/acknowledge/0.1/payload.js +636 -0
  111. package/dist/vtc/admin/actions/acknowledge/0.1/payload.js.map +1 -0
  112. package/dist/vtc/admin/actions/cancel/0.1/payload.d.ts +1026 -0
  113. package/dist/vtc/admin/actions/cancel/0.1/payload.d.ts.map +1 -0
  114. package/dist/vtc/admin/actions/cancel/0.1/payload.js +641 -0
  115. package/dist/vtc/admin/actions/cancel/0.1/payload.js.map +1 -0
  116. package/dist/vtc/admin/actions/list/0.1/payload.d.ts +1200 -0
  117. package/dist/vtc/admin/actions/list/0.1/payload.d.ts.map +1 -0
  118. package/dist/vtc/admin/actions/list/0.1/payload.js +726 -0
  119. package/dist/vtc/admin/actions/list/0.1/payload.js.map +1 -0
  120. package/dist/vtc/admin/actions/show/0.1/payload.d.ts +1012 -0
  121. package/dist/vtc/admin/actions/show/0.1/payload.d.ts.map +1 -0
  122. package/dist/vtc/admin/actions/show/0.1/payload.js +636 -0
  123. package/dist/vtc/admin/actions/show/0.1/payload.js.map +1 -0
  124. package/dist/vtc/install/claim/finish/0.3/payload.d.ts +379 -0
  125. package/dist/vtc/install/claim/finish/0.3/payload.d.ts.map +1 -0
  126. package/dist/vtc/install/claim/finish/0.3/payload.js +205 -0
  127. package/dist/vtc/install/claim/finish/0.3/payload.js.map +1 -0
  128. package/dist/vtc/install/claim/start/0.3/payload.d.ts +368 -0
  129. package/dist/vtc/install/claim/start/0.3/payload.d.ts.map +1 -0
  130. package/dist/vtc/install/claim/start/0.3/payload.js +201 -0
  131. package/dist/vtc/install/claim/start/0.3/payload.js.map +1 -0
  132. package/dist/vtc/members/authority-reduced-notice/0.1/payload.d.ts +208 -0
  133. package/dist/vtc/members/authority-reduced-notice/0.1/payload.d.ts.map +1 -0
  134. package/dist/vtc/members/authority-reduced-notice/0.1/payload.js +112 -0
  135. package/dist/vtc/members/authority-reduced-notice/0.1/payload.js.map +1 -0
  136. package/dist/vtc/roles/_shared/0.1/role.d.ts +16 -0
  137. package/dist/vtc/roles/_shared/0.1/role.d.ts.map +1 -0
  138. package/dist/vtc/roles/_shared/0.1/role.js +6 -0
  139. package/dist/vtc/roles/_shared/0.1/role.js.map +1 -0
  140. package/dist/vtc/roles/define/0.1/payload.d.ts +703 -0
  141. package/dist/vtc/roles/define/0.1/payload.d.ts.map +1 -0
  142. package/dist/vtc/roles/define/0.1/payload.js +371 -0
  143. package/dist/vtc/roles/define/0.1/payload.js.map +1 -0
  144. package/dist/vtc/roles/delete/0.1/payload.d.ts +281 -0
  145. package/dist/vtc/roles/delete/0.1/payload.d.ts.map +1 -0
  146. package/dist/vtc/roles/delete/0.1/payload.js +152 -0
  147. package/dist/vtc/roles/delete/0.1/payload.js.map +1 -0
  148. package/dist/vtc/roles/list/0.1/payload.d.ts +639 -0
  149. package/dist/vtc/roles/list/0.1/payload.d.ts.map +1 -0
  150. package/dist/vtc/roles/list/0.1/payload.js +345 -0
  151. package/dist/vtc/roles/list/0.1/payload.js.map +1 -0
  152. package/dist/vtc/roles/show/0.1/payload.d.ts +651 -0
  153. package/dist/vtc/roles/show/0.1/payload.d.ts.map +1 -0
  154. package/dist/vtc/roles/show/0.1/payload.js +351 -0
  155. package/dist/vtc/roles/show/0.1/payload.js.map +1 -0
  156. package/package.json +1 -1
  157. package/src/_shared/components.ts +440 -1
  158. package/src/acl/_shared/0.1/acl-entry.ts +1 -1
  159. package/src/acl/_shared/0.2/acl-entry.ts +23 -0
  160. package/src/acl/change-role/0.1/payload.ts +1 -1
  161. package/src/acl/change-role/0.2/payload.ts +1011 -0
  162. package/src/acl/grant/0.1/payload.ts +1 -1
  163. package/src/acl/grant/0.2/payload.ts +990 -0
  164. package/src/acl/list/0.1/payload.ts +1 -1
  165. package/src/acl/list/0.2/payload.ts +1125 -0
  166. package/src/acl/revoke/0.1/payload.ts +1 -1
  167. package/src/acl/revoke/0.2/payload.ts +1122 -0
  168. package/src/acl/show/0.1/payload.ts +1 -1
  169. package/src/acl/show/0.2/payload.ts +1016 -0
  170. package/src/acl/swap-key/0.1/payload.ts +1 -1
  171. package/src/acl/update/0.1/payload.ts +1 -1
  172. package/src/acl/update/0.2/payload.ts +1094 -0
  173. package/src/auth/signing-key/authorize/0.1/payload.ts +141 -0
  174. package/src/auth/signing-key/enroll/0.2/payload.ts +365 -0
  175. package/src/auth/step-up/approve-request/0.4/payload.ts +461 -0
  176. package/src/auth/step-up/approve-response/0.6/payload.ts +648 -0
  177. package/src/auth/step-up/approver/_shared/0.1/approver.ts +17 -0
  178. package/src/auth/step-up/approver/attest/0.1/payload.ts +135 -0
  179. package/src/auth/step-up/approver/enroll/0.1/payload.ts +329 -0
  180. package/src/auth/step-up/approver/invite/0.1/payload.ts +258 -0
  181. package/src/auth/step-up/approver/list/0.1/payload.ts +318 -0
  182. package/src/auth/step-up/approver/redeem/finish/0.1/payload.ts +337 -0
  183. package/src/auth/step-up/approver/redeem/start/0.1/payload.ts +241 -0
  184. package/src/auth/step-up/approver/revoke/0.1/payload.ts +352 -0
  185. package/src/index.ts +33 -0
  186. package/src/task-consent/decision/0.2/payload.ts +537 -0
  187. package/src/vtc/admin/actions/_shared/0.1/action.ts +25 -0
  188. package/src/vtc/admin/actions/acknowledge/0.1/payload.ts +671 -0
  189. package/src/vtc/admin/actions/cancel/0.1/payload.ts +680 -0
  190. package/src/vtc/admin/actions/list/0.1/payload.ts +795 -0
  191. package/src/vtc/admin/actions/show/0.1/payload.ts +671 -0
  192. package/src/vtc/install/claim/finish/0.3/payload.ts +253 -0
  193. package/src/vtc/install/claim/start/0.3/payload.ts +256 -0
  194. package/src/vtc/members/authority-reduced-notice/0.1/payload.ts +162 -0
  195. package/src/vtc/roles/_shared/0.1/role.ts +17 -0
  196. package/src/vtc/roles/define/0.1/payload.ts +435 -0
  197. package/src/vtc/roles/delete/0.1/payload.ts +200 -0
  198. package/src/vtc/roles/list/0.1/payload.ts +389 -0
  199. package/src/vtc/roles/show/0.1/payload.ts +399 -0
@@ -0,0 +1,1853 @@
1
+ /**
2
+ * Generated by scripts/build-ts-bindings.mjs — DO NOT EDIT BY HAND.
3
+ * Source: specs/acl/list/0.2/payload.schema.json
4
+ */
5
+ import type { AclEntry_AclV0_2 as AclEntry, ApproveCapabilityScope, ApproveCapabilityScopeListed, AuthorityScope, AuthorityScopeAll, AuthorityScopeContexts, AuthorityScopeNone, Capability_AclV0_2 as Capability, CapabilityGrant, CapabilityRef, CapabilityScope, CapabilityScopeCeiling, CapabilityScopeListed, CapabilityScopeNone, ContextPath, Ext, KeyScope, KeyScopeAll, KeyScopeListed, KeyScopeNone, ResourceQualifier } from "../../../_shared/components.js";
6
+ /**
7
+ * Enumerate the AclEntry 0.2 records a maintainer holds, with optional conjunctive filters and paging. A hierarchical filter (`context`, `resource`) MUST state its `direction`; there is no default direction. The outer document members are owned by the framework — SPEC §6.3.
8
+ */
9
+ export interface ACLList02Payload {
10
+ /**
11
+ * Optional filter — only entries with this role are returned.
12
+ */
13
+ role?: string;
14
+ /**
15
+ * Optional filter on the entries' ACT scope, read in the stated `direction`. REQUIRES `direction`. Replaces 0.1's `scope` filter.
16
+ */
17
+ context?: ContextPath;
18
+ /**
19
+ * Optional filter — only entries whose EFFECTIVE capability set includes this capability (the role's full ceiling for `capabilities: {scope: ceiling}`, nothing for `none`, and for `listed` the ceiling ∩ the non-additive grants plus the additive grants). Combined with `resource`, the capability must be held at a qualifier related to that resource by `direction`.
20
+ */
21
+ capability?: Capability;
22
+ /**
23
+ * Optional filter on the resource qualifiers of the entries' effective capabilities (of `capability` when given, of any capability otherwise), read in the stated `direction`. REQUIRES `direction`.
24
+ */
25
+ resource?: ResourceQualifier;
26
+ /**
27
+ * How to read a hierarchical filter (`context`, `resource`). REQUIRED when either is present and REFUSED when neither is: `actingIn` — entries whose scope or qualifier is an ancestor-or-self of the queried one, i.e. who may act IN it (unrestricted act scopes and unqualified capabilities match); `subtree` — entries holding a grant at or BENEATH the queried one (an unrestricted act scope or an unqualified capability does NOT match, and an entry naming contexts both inside and outside the subtree DOES); `any` — the union. Same three questions as 0.1's `acting-in` / `subtree` / `any`, re-cased to lowerCamelCase, with no default.
28
+ */
29
+ direction?: "actingIn" | "subtree" | "any";
30
+ /**
31
+ * Optional filter — only entries whose subject VID starts with this prefix are returned.
32
+ */
33
+ subjectPrefix?: string;
34
+ /**
35
+ * Maximum number of entries to return. Maintainer-defined default and ceiling.
36
+ */
37
+ pageSize?: number;
38
+ /**
39
+ * Opaque continuation token returned by the maintainer in a previous response. It binds the filters and `direction` it was minted under; a follow-up request MUST repeat them unchanged.
40
+ */
41
+ cursor?: string;
42
+ /**
43
+ * Ecosystem-defined extension members per SPEC.md §4.5.1.
44
+ */
45
+ ext?: Ext;
46
+ }
47
+ /**
48
+ * The success response to an acl/list/0.2 request. Carried in a Trust Task document whose type is https://trusttasks.org/spec/acl/list/0.2#response.
49
+ */
50
+ export interface ACLList02ResponsePayload {
51
+ /**
52
+ * Matching AclEntry items, in maintainer-defined order. May be empty.
53
+ */
54
+ entries: AclEntry[];
55
+ /**
56
+ * true when more matching entries exist beyond `entries`; false when this response is the complete result. Independent of `cursor`: a maintainer MAY truncate without supporting pagination, in which case `truncated` is true and `cursor` is absent.
57
+ */
58
+ truncated: boolean;
59
+ /**
60
+ * Opaque continuation token to fetch the next page. Present only when `truncated` is true AND the maintainer supports pagination from this point. Binds the request's filters and direction. Consumers MUST treat it as opaque and re-send it verbatim.
61
+ */
62
+ cursor?: string;
63
+ /**
64
+ * Names of AclEntry members the maintainer redacted from every returned entry. `act`, `keys` and `capabilities` are never redacted; `approve` and `approveCapabilities` SHOULD NOT be (see acl/show/0.2).
65
+ */
66
+ redactedFields?: string[];
67
+ /**
68
+ * Ecosystem-defined extension members per SPEC.md §4.5.1.
69
+ */
70
+ ext?: Ext;
71
+ }
72
+ /** Shared definitions this specification references, re-exported under the names it used to declare them with. */
73
+ export type { AclEntry, ApproveCapabilityScope, ApproveCapabilityScopeListed, AuthorityScope, AuthorityScopeAll, AuthorityScopeContexts, AuthorityScopeNone, Capability, CapabilityGrant, CapabilityRef, CapabilityScope, CapabilityScopeCeiling, CapabilityScopeListed, CapabilityScopeNone, ContextPath, Ext, KeyScope, KeyScopeAll, KeyScopeListed, KeyScopeNone, ResourceQualifier };
74
+ /** Trust Task type URI. */
75
+ export declare const TYPE_URI: "https://trusttasks.org/spec/acl/list/0.2";
76
+ /** Stable alias for this specification's request payload shape. */
77
+ export type Payload = ACLList02Payload;
78
+ /** Trust Task response type URI (request type URI + "#response"). */
79
+ export declare const RESPONSE_TYPE_URI: "https://trusttasks.org/spec/acl/list/0.2#response";
80
+ /** Stable alias for this specification's success-response payload shape. */
81
+ export type Response = ACLList02ResponsePayload;
82
+ /**
83
+ * This specification's payload schema, as a value.
84
+ *
85
+ * SPEC.md §7.2 item 2 is performed against this. It is shipped as data
86
+ * rather than only as a `.json` file because TypeScript types are erased
87
+ * at runtime: without a schema a consumer has nothing to validate, and
88
+ * every REQUIRED payload member is optional in practice. Cross-file
89
+ * `$ref`s are already inlined, so it needs no resolver.
90
+ */
91
+ export declare const PAYLOAD_SCHEMA: {
92
+ readonly $schema: "https://json-schema.org/draft/2020-12/schema";
93
+ readonly $id: "https://trusttasks.org/spec/acl/list/0.2";
94
+ readonly title: "ACL List 0.2 — payload";
95
+ readonly description: "Enumerate the AclEntry 0.2 records a maintainer holds, with optional conjunctive filters and paging. A hierarchical filter (`context`, `resource`) MUST state its `direction`; there is no default direction. The outer document members are owned by the framework — SPEC §6.3.";
96
+ readonly type: "object";
97
+ readonly additionalProperties: false;
98
+ readonly dependentRequired: {
99
+ readonly context: readonly ["direction"];
100
+ readonly resource: readonly ["direction"];
101
+ };
102
+ readonly dependentSchemas: {
103
+ readonly direction: {
104
+ readonly anyOf: readonly [{
105
+ readonly required: readonly ["context"];
106
+ }, {
107
+ readonly required: readonly ["resource"];
108
+ }];
109
+ };
110
+ };
111
+ readonly properties: {
112
+ readonly role: {
113
+ readonly type: "string";
114
+ readonly minLength: 1;
115
+ readonly description: "Optional filter — only entries with this role are returned.";
116
+ };
117
+ readonly context: {
118
+ readonly $ref: "#/$defs/ContextPath";
119
+ readonly description: "Optional filter on the entries' ACT scope, read in the stated `direction`. REQUIRES `direction`. Replaces 0.1's `scope` filter.";
120
+ };
121
+ readonly capability: {
122
+ readonly $ref: "#/$defs/Capability";
123
+ readonly description: "Optional filter — only entries whose EFFECTIVE capability set includes this capability (the role's full ceiling for `capabilities: {scope: ceiling}`, nothing for `none`, and for `listed` the ceiling ∩ the non-additive grants plus the additive grants). Combined with `resource`, the capability must be held at a qualifier related to that resource by `direction`.";
124
+ };
125
+ readonly resource: {
126
+ readonly $ref: "#/$defs/ResourceQualifier";
127
+ readonly description: "Optional filter on the resource qualifiers of the entries' effective capabilities (of `capability` when given, of any capability otherwise), read in the stated `direction`. REQUIRES `direction`.";
128
+ };
129
+ readonly direction: {
130
+ readonly type: "string";
131
+ readonly enum: readonly ["actingIn", "subtree", "any"];
132
+ readonly description: "How to read a hierarchical filter (`context`, `resource`). REQUIRED when either is present and REFUSED when neither is: `actingIn` — entries whose scope or qualifier is an ancestor-or-self of the queried one, i.e. who may act IN it (unrestricted act scopes and unqualified capabilities match); `subtree` — entries holding a grant at or BENEATH the queried one (an unrestricted act scope or an unqualified capability does NOT match, and an entry naming contexts both inside and outside the subtree DOES); `any` — the union. Same three questions as 0.1's `acting-in` / `subtree` / `any`, re-cased to lowerCamelCase, with no default.";
133
+ };
134
+ readonly subjectPrefix: {
135
+ readonly type: "string";
136
+ readonly minLength: 1;
137
+ readonly description: "Optional filter — only entries whose subject VID starts with this prefix are returned.";
138
+ };
139
+ readonly pageSize: {
140
+ readonly type: "integer";
141
+ readonly minimum: 1;
142
+ readonly maximum: 1000;
143
+ readonly description: "Maximum number of entries to return. Maintainer-defined default and ceiling.";
144
+ };
145
+ readonly cursor: {
146
+ readonly type: "string";
147
+ readonly minLength: 1;
148
+ readonly maxLength: 2048;
149
+ readonly description: "Opaque continuation token returned by the maintainer in a previous response. It binds the filters and `direction` it was minted under; a follow-up request MUST repeat them unchanged.";
150
+ };
151
+ readonly ext: {
152
+ readonly $ref: "#/$defs/Ext";
153
+ readonly description: "Ecosystem-defined extension members per SPEC.md §4.5.1.";
154
+ };
155
+ };
156
+ readonly $defs: {
157
+ readonly Response: {
158
+ readonly $anchor: "response";
159
+ readonly title: "ACL List 0.2 — response payload";
160
+ readonly description: "The success response to an acl/list/0.2 request. Carried in a Trust Task document whose type is https://trusttasks.org/spec/acl/list/0.2#response.";
161
+ readonly type: "object";
162
+ readonly additionalProperties: false;
163
+ readonly required: readonly ["entries", "truncated"];
164
+ readonly properties: {
165
+ readonly entries: {
166
+ readonly type: "array";
167
+ readonly items: {
168
+ readonly $ref: "#/$defs/AclEntry";
169
+ };
170
+ readonly description: "Matching AclEntry items, in maintainer-defined order. May be empty.";
171
+ };
172
+ readonly truncated: {
173
+ readonly type: "boolean";
174
+ readonly description: "true when more matching entries exist beyond `entries`; false when this response is the complete result. Independent of `cursor`: a maintainer MAY truncate without supporting pagination, in which case `truncated` is true and `cursor` is absent.";
175
+ };
176
+ readonly cursor: {
177
+ readonly type: "string";
178
+ readonly minLength: 1;
179
+ readonly maxLength: 2048;
180
+ readonly description: "Opaque continuation token to fetch the next page. Present only when `truncated` is true AND the maintainer supports pagination from this point. Binds the request's filters and direction. Consumers MUST treat it as opaque and re-send it verbatim.";
181
+ };
182
+ readonly redactedFields: {
183
+ readonly type: "array";
184
+ readonly items: {
185
+ readonly type: "string";
186
+ readonly minLength: 1;
187
+ };
188
+ readonly description: "Names of AclEntry members the maintainer redacted from every returned entry. `act`, `keys` and `capabilities` are never redacted; `approve` and `approveCapabilities` SHOULD NOT be (see acl/show/0.2).";
189
+ };
190
+ readonly ext: {
191
+ readonly $ref: "#/$defs/Ext";
192
+ readonly description: "Ecosystem-defined extension members per SPEC.md §4.5.1.";
193
+ };
194
+ };
195
+ };
196
+ readonly Ext: {
197
+ readonly title: "Ext";
198
+ readonly 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.";
199
+ readonly type: "object";
200
+ readonly minProperties: 1;
201
+ readonly additionalProperties: true;
202
+ readonly propertyNames: {
203
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
204
+ };
205
+ };
206
+ readonly AclEntry: {
207
+ readonly title: "AclEntry";
208
+ readonly 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.";
209
+ readonly type: "object";
210
+ readonly additionalProperties: false;
211
+ readonly required: readonly ["subject", "role", "act", "keys", "capabilities"];
212
+ readonly properties: {
213
+ readonly subject: {
214
+ readonly type: "string";
215
+ readonly minLength: 1;
216
+ readonly description: "VID of the party in the ACL. Compared by exact string equality (SPEC.md §4.8); producers SHOULD emit canonical form.";
217
+ };
218
+ readonly role: {
219
+ readonly type: "string";
220
+ readonly minLength: 1;
221
+ readonly 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.";
222
+ };
223
+ readonly act: {
224
+ readonly $ref: "#/$defs/AuthorityScope";
225
+ readonly 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`.";
226
+ };
227
+ readonly approve: {
228
+ readonly $ref: "#/$defs/AuthorityScope";
229
+ readonly 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}`.";
230
+ };
231
+ readonly capabilities: {
232
+ readonly $ref: "#/$defs/CapabilityScope";
233
+ readonly 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.";
234
+ };
235
+ readonly approveCapabilities: {
236
+ readonly $ref: "#/$defs/ApproveCapabilityScope";
237
+ readonly 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.";
238
+ };
239
+ readonly delegatedBy: {
240
+ readonly type: "string";
241
+ readonly minLength: 1;
242
+ readonly 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).";
243
+ };
244
+ readonly keys: {
245
+ readonly $ref: "#/$defs/KeyScope";
246
+ readonly 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.";
247
+ };
248
+ readonly label: {
249
+ readonly type: "string";
250
+ readonly maxLength: 256;
251
+ readonly description: "Optional human-readable label. Confers nothing.";
252
+ };
253
+ readonly createdAt: {
254
+ readonly type: "string";
255
+ readonly format: "date-time";
256
+ };
257
+ readonly createdBy: {
258
+ readonly type: "string";
259
+ readonly description: "VID of the party that originally wrote this entry.";
260
+ };
261
+ readonly updatedAt: {
262
+ readonly type: "string";
263
+ readonly format: "date-time";
264
+ };
265
+ readonly updatedBy: {
266
+ readonly type: "string";
267
+ readonly description: "VID of the party that last modified this entry.";
268
+ };
269
+ readonly expiresAt: {
270
+ readonly type: "string";
271
+ readonly format: "date-time";
272
+ readonly description: "Optional time after which the entry confers no authority. Evaluated at every authorization decision, not only when a session is established.";
273
+ };
274
+ readonly stepUp: {
275
+ readonly type: "object";
276
+ readonly additionalProperties: false;
277
+ readonly 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.";
278
+ readonly properties: {
279
+ readonly approver: {
280
+ readonly type: "string";
281
+ readonly 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.";
282
+ };
283
+ readonly require: {
284
+ readonly type: "string";
285
+ readonly enum: readonly ["self", "delegated"];
286
+ readonly 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).";
287
+ };
288
+ };
289
+ };
290
+ readonly ext: {
291
+ readonly $ref: "#/$defs/Ext";
292
+ readonly 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.";
293
+ };
294
+ };
295
+ };
296
+ readonly KeyScope: {
297
+ readonly title: "KeyScope";
298
+ readonly 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.";
299
+ readonly oneOf: readonly [{
300
+ readonly $ref: "#/$defs/KeyScopeAll";
301
+ }, {
302
+ readonly $ref: "#/$defs/KeyScopeNone";
303
+ }, {
304
+ readonly $ref: "#/$defs/KeyScopeListed";
305
+ }];
306
+ };
307
+ readonly KeyScopeListed: {
308
+ readonly title: "KeyScopeListed";
309
+ readonly description: "Exactly the listed keys, intersected with the entry's act scope.";
310
+ readonly type: "object";
311
+ readonly additionalProperties: false;
312
+ readonly required: readonly ["scope", "keys"];
313
+ readonly properties: {
314
+ readonly scope: {
315
+ readonly const: "listed";
316
+ };
317
+ readonly keys: {
318
+ readonly type: "array";
319
+ readonly minItems: 1;
320
+ readonly uniqueItems: true;
321
+ readonly items: {
322
+ readonly type: "string";
323
+ readonly minLength: 1;
324
+ readonly maxLength: 512;
325
+ };
326
+ readonly description: "Non-empty set of key identifiers. An empty array is invalid (it is neither `all` nor `none`).";
327
+ };
328
+ };
329
+ };
330
+ readonly KeyScopeNone: {
331
+ readonly title: "KeyScopeNone";
332
+ readonly description: "No keys.";
333
+ readonly type: "object";
334
+ readonly additionalProperties: false;
335
+ readonly required: readonly ["scope"];
336
+ readonly properties: {
337
+ readonly scope: {
338
+ readonly const: "none";
339
+ };
340
+ };
341
+ };
342
+ readonly KeyScopeAll: {
343
+ readonly title: "KeyScopeAll";
344
+ readonly description: "Every key the entry's act scope reaches.";
345
+ readonly type: "object";
346
+ readonly additionalProperties: false;
347
+ readonly required: readonly ["scope"];
348
+ readonly properties: {
349
+ readonly scope: {
350
+ readonly const: "all";
351
+ };
352
+ };
353
+ };
354
+ readonly ApproveCapabilityScope: {
355
+ readonly title: "ApproveCapabilityScope";
356
+ readonly 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.";
357
+ readonly oneOf: readonly [{
358
+ readonly $ref: "#/$defs/CapabilityScopeCeiling";
359
+ }, {
360
+ readonly $ref: "#/$defs/CapabilityScopeNone";
361
+ }, {
362
+ readonly $ref: "#/$defs/ApproveCapabilityScopeListed";
363
+ }];
364
+ };
365
+ readonly ApproveCapabilityScopeListed: {
366
+ readonly title: "ApproveCapabilityScopeListed";
367
+ readonly description: "Exactly the listed capabilities, intersected with the role's approve ceiling where the maintainer's roles define one.";
368
+ readonly type: "object";
369
+ readonly additionalProperties: false;
370
+ readonly required: readonly ["scope", "grants"];
371
+ readonly properties: {
372
+ readonly scope: {
373
+ readonly const: "listed";
374
+ };
375
+ readonly grants: {
376
+ readonly type: "array";
377
+ readonly minItems: 1;
378
+ readonly items: {
379
+ readonly $ref: "#/$defs/CapabilityRef";
380
+ };
381
+ readonly description: "Non-empty list of approvable capabilities. An empty array is invalid.";
382
+ };
383
+ };
384
+ };
385
+ readonly CapabilityRef: {
386
+ readonly title: "CapabilityRef";
387
+ readonly 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.";
388
+ readonly type: "object";
389
+ readonly additionalProperties: false;
390
+ readonly required: readonly ["capability"];
391
+ readonly properties: {
392
+ readonly capability: {
393
+ readonly $ref: "#/$defs/Capability";
394
+ };
395
+ readonly resource: {
396
+ readonly $ref: "#/$defs/ResourceQualifier";
397
+ readonly description: "Optional qualifier. Absent covers every resource of the capability's kind.";
398
+ };
399
+ };
400
+ };
401
+ readonly ResourceQualifier: {
402
+ readonly title: "ResourceQualifier";
403
+ readonly 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.";
404
+ readonly type: "string";
405
+ readonly minLength: 1;
406
+ readonly maxLength: 512;
407
+ };
408
+ readonly Capability: {
409
+ readonly title: "Capability";
410
+ readonly 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.";
411
+ readonly type: "string";
412
+ readonly minLength: 1;
413
+ readonly maxLength: 128;
414
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)*$";
415
+ };
416
+ readonly CapabilityScopeNone: {
417
+ readonly title: "CapabilityScopeNone";
418
+ readonly description: "No capabilities on this axis.";
419
+ readonly type: "object";
420
+ readonly additionalProperties: false;
421
+ readonly required: readonly ["scope"];
422
+ readonly properties: {
423
+ readonly scope: {
424
+ readonly const: "none";
425
+ };
426
+ };
427
+ };
428
+ readonly CapabilityScopeCeiling: {
429
+ readonly title: "CapabilityScopeCeiling";
430
+ readonly 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\".";
431
+ readonly type: "object";
432
+ readonly additionalProperties: false;
433
+ readonly required: readonly ["scope"];
434
+ readonly properties: {
435
+ readonly scope: {
436
+ readonly const: "ceiling";
437
+ };
438
+ };
439
+ };
440
+ readonly CapabilityScope: {
441
+ readonly title: "CapabilityScope";
442
+ readonly 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.";
443
+ readonly oneOf: readonly [{
444
+ readonly $ref: "#/$defs/CapabilityScopeCeiling";
445
+ }, {
446
+ readonly $ref: "#/$defs/CapabilityScopeNone";
447
+ }, {
448
+ readonly $ref: "#/$defs/CapabilityScopeListed";
449
+ }];
450
+ };
451
+ readonly CapabilityScopeListed: {
452
+ readonly title: "CapabilityScopeListed";
453
+ readonly description: "Exactly the listed grants: (role ceiling ∩ non-additive grants) ∪ additive grants.";
454
+ readonly type: "object";
455
+ readonly additionalProperties: false;
456
+ readonly required: readonly ["scope", "grants"];
457
+ readonly properties: {
458
+ readonly scope: {
459
+ readonly const: "listed";
460
+ };
461
+ readonly grants: {
462
+ readonly type: "array";
463
+ readonly minItems: 1;
464
+ readonly items: {
465
+ readonly $ref: "#/$defs/CapabilityGrant";
466
+ };
467
+ readonly description: "Non-empty list of capability grants. An empty array is invalid (it is neither `ceiling` nor `none`).";
468
+ };
469
+ };
470
+ };
471
+ readonly CapabilityGrant: {
472
+ readonly title: "CapabilityGrant";
473
+ readonly 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.";
474
+ readonly type: "object";
475
+ readonly additionalProperties: false;
476
+ readonly required: readonly ["capability"];
477
+ readonly properties: {
478
+ readonly capability: {
479
+ readonly $ref: "#/$defs/Capability";
480
+ };
481
+ readonly resource: {
482
+ readonly $ref: "#/$defs/ResourceQualifier";
483
+ readonly description: "Optional qualifier. Absent covers every resource of the capability's kind.";
484
+ };
485
+ readonly additive: {
486
+ readonly type: "boolean";
487
+ readonly 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.";
488
+ };
489
+ };
490
+ };
491
+ readonly AuthorityScope: {
492
+ readonly title: "AuthorityScope";
493
+ readonly 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.";
494
+ readonly oneOf: readonly [{
495
+ readonly $ref: "#/$defs/AuthorityScopeAll";
496
+ }, {
497
+ readonly $ref: "#/$defs/AuthorityScopeNone";
498
+ }, {
499
+ readonly $ref: "#/$defs/AuthorityScopeContexts";
500
+ }];
501
+ };
502
+ readonly AuthorityScopeContexts: {
503
+ readonly title: "AuthorityScopeContexts";
504
+ readonly 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.";
505
+ readonly type: "object";
506
+ readonly additionalProperties: false;
507
+ readonly required: readonly ["scope", "contexts"];
508
+ readonly properties: {
509
+ readonly scope: {
510
+ readonly const: "contexts";
511
+ };
512
+ readonly contexts: {
513
+ readonly type: "array";
514
+ readonly minItems: 1;
515
+ readonly uniqueItems: true;
516
+ readonly items: {
517
+ readonly $ref: "#/$defs/ContextPath";
518
+ };
519
+ readonly description: "Non-empty set of context paths. An empty array is invalid (it is neither `all` nor `none`).";
520
+ };
521
+ };
522
+ };
523
+ readonly ContextPath: {
524
+ readonly title: "ContextPath";
525
+ readonly description: "Opaque identifier of one of the maintainer's contexts, compared by the maintainer's own ancestry predicate. Its grammar is the maintainer's.";
526
+ readonly type: "string";
527
+ readonly minLength: 1;
528
+ readonly maxLength: 512;
529
+ };
530
+ readonly AuthorityScopeNone: {
531
+ readonly title: "AuthorityScopeNone";
532
+ readonly 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.";
533
+ readonly type: "object";
534
+ readonly additionalProperties: false;
535
+ readonly required: readonly ["scope"];
536
+ readonly properties: {
537
+ readonly scope: {
538
+ readonly const: "none";
539
+ };
540
+ };
541
+ };
542
+ readonly AuthorityScopeAll: {
543
+ readonly title: "AuthorityScopeAll";
544
+ readonly 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).";
545
+ readonly type: "object";
546
+ readonly additionalProperties: false;
547
+ readonly required: readonly ["scope"];
548
+ readonly properties: {
549
+ readonly scope: {
550
+ readonly const: "all";
551
+ };
552
+ };
553
+ };
554
+ };
555
+ };
556
+ /** As {@link PAYLOAD_SCHEMA}, for the success-response variant. */
557
+ export declare const RESPONSE_PAYLOAD_SCHEMA: {
558
+ readonly $schema: "https://json-schema.org/draft/2020-12/schema";
559
+ readonly $ref: "#/$defs/Response";
560
+ readonly $defs: {
561
+ readonly Response: {
562
+ readonly $anchor: "response";
563
+ readonly title: "ACL List 0.2 — response payload";
564
+ readonly description: "The success response to an acl/list/0.2 request. Carried in a Trust Task document whose type is https://trusttasks.org/spec/acl/list/0.2#response.";
565
+ readonly type: "object";
566
+ readonly additionalProperties: false;
567
+ readonly required: readonly ["entries", "truncated"];
568
+ readonly properties: {
569
+ readonly entries: {
570
+ readonly type: "array";
571
+ readonly items: {
572
+ readonly $ref: "#/$defs/AclEntry";
573
+ };
574
+ readonly description: "Matching AclEntry items, in maintainer-defined order. May be empty.";
575
+ };
576
+ readonly truncated: {
577
+ readonly type: "boolean";
578
+ readonly description: "true when more matching entries exist beyond `entries`; false when this response is the complete result. Independent of `cursor`: a maintainer MAY truncate without supporting pagination, in which case `truncated` is true and `cursor` is absent.";
579
+ };
580
+ readonly cursor: {
581
+ readonly type: "string";
582
+ readonly minLength: 1;
583
+ readonly maxLength: 2048;
584
+ readonly description: "Opaque continuation token to fetch the next page. Present only when `truncated` is true AND the maintainer supports pagination from this point. Binds the request's filters and direction. Consumers MUST treat it as opaque and re-send it verbatim.";
585
+ };
586
+ readonly redactedFields: {
587
+ readonly type: "array";
588
+ readonly items: {
589
+ readonly type: "string";
590
+ readonly minLength: 1;
591
+ };
592
+ readonly description: "Names of AclEntry members the maintainer redacted from every returned entry. `act`, `keys` and `capabilities` are never redacted; `approve` and `approveCapabilities` SHOULD NOT be (see acl/show/0.2).";
593
+ };
594
+ readonly ext: {
595
+ readonly $ref: "#/$defs/Ext";
596
+ readonly description: "Ecosystem-defined extension members per SPEC.md §4.5.1.";
597
+ };
598
+ };
599
+ };
600
+ readonly Ext: {
601
+ readonly title: "Ext";
602
+ readonly 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.";
603
+ readonly type: "object";
604
+ readonly minProperties: 1;
605
+ readonly additionalProperties: true;
606
+ readonly propertyNames: {
607
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
608
+ };
609
+ };
610
+ readonly AclEntry: {
611
+ readonly title: "AclEntry";
612
+ readonly 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.";
613
+ readonly type: "object";
614
+ readonly additionalProperties: false;
615
+ readonly required: readonly ["subject", "role", "act", "keys", "capabilities"];
616
+ readonly properties: {
617
+ readonly subject: {
618
+ readonly type: "string";
619
+ readonly minLength: 1;
620
+ readonly description: "VID of the party in the ACL. Compared by exact string equality (SPEC.md §4.8); producers SHOULD emit canonical form.";
621
+ };
622
+ readonly role: {
623
+ readonly type: "string";
624
+ readonly minLength: 1;
625
+ readonly 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.";
626
+ };
627
+ readonly act: {
628
+ readonly $ref: "#/$defs/AuthorityScope";
629
+ readonly 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`.";
630
+ };
631
+ readonly approve: {
632
+ readonly $ref: "#/$defs/AuthorityScope";
633
+ readonly 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}`.";
634
+ };
635
+ readonly capabilities: {
636
+ readonly $ref: "#/$defs/CapabilityScope";
637
+ readonly 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.";
638
+ };
639
+ readonly approveCapabilities: {
640
+ readonly $ref: "#/$defs/ApproveCapabilityScope";
641
+ readonly 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.";
642
+ };
643
+ readonly delegatedBy: {
644
+ readonly type: "string";
645
+ readonly minLength: 1;
646
+ readonly 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).";
647
+ };
648
+ readonly keys: {
649
+ readonly $ref: "#/$defs/KeyScope";
650
+ readonly 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.";
651
+ };
652
+ readonly label: {
653
+ readonly type: "string";
654
+ readonly maxLength: 256;
655
+ readonly description: "Optional human-readable label. Confers nothing.";
656
+ };
657
+ readonly createdAt: {
658
+ readonly type: "string";
659
+ readonly format: "date-time";
660
+ };
661
+ readonly createdBy: {
662
+ readonly type: "string";
663
+ readonly description: "VID of the party that originally wrote this entry.";
664
+ };
665
+ readonly updatedAt: {
666
+ readonly type: "string";
667
+ readonly format: "date-time";
668
+ };
669
+ readonly updatedBy: {
670
+ readonly type: "string";
671
+ readonly description: "VID of the party that last modified this entry.";
672
+ };
673
+ readonly expiresAt: {
674
+ readonly type: "string";
675
+ readonly format: "date-time";
676
+ readonly description: "Optional time after which the entry confers no authority. Evaluated at every authorization decision, not only when a session is established.";
677
+ };
678
+ readonly stepUp: {
679
+ readonly type: "object";
680
+ readonly additionalProperties: false;
681
+ readonly 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.";
682
+ readonly properties: {
683
+ readonly approver: {
684
+ readonly type: "string";
685
+ readonly 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.";
686
+ };
687
+ readonly require: {
688
+ readonly type: "string";
689
+ readonly enum: readonly ["self", "delegated"];
690
+ readonly 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).";
691
+ };
692
+ };
693
+ };
694
+ readonly ext: {
695
+ readonly $ref: "#/$defs/Ext";
696
+ readonly 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.";
697
+ };
698
+ };
699
+ };
700
+ readonly KeyScope: {
701
+ readonly title: "KeyScope";
702
+ readonly 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.";
703
+ readonly oneOf: readonly [{
704
+ readonly $ref: "#/$defs/KeyScopeAll";
705
+ }, {
706
+ readonly $ref: "#/$defs/KeyScopeNone";
707
+ }, {
708
+ readonly $ref: "#/$defs/KeyScopeListed";
709
+ }];
710
+ };
711
+ readonly KeyScopeListed: {
712
+ readonly title: "KeyScopeListed";
713
+ readonly description: "Exactly the listed keys, intersected with the entry's act scope.";
714
+ readonly type: "object";
715
+ readonly additionalProperties: false;
716
+ readonly required: readonly ["scope", "keys"];
717
+ readonly properties: {
718
+ readonly scope: {
719
+ readonly const: "listed";
720
+ };
721
+ readonly keys: {
722
+ readonly type: "array";
723
+ readonly minItems: 1;
724
+ readonly uniqueItems: true;
725
+ readonly items: {
726
+ readonly type: "string";
727
+ readonly minLength: 1;
728
+ readonly maxLength: 512;
729
+ };
730
+ readonly description: "Non-empty set of key identifiers. An empty array is invalid (it is neither `all` nor `none`).";
731
+ };
732
+ };
733
+ };
734
+ readonly KeyScopeNone: {
735
+ readonly title: "KeyScopeNone";
736
+ readonly description: "No keys.";
737
+ readonly type: "object";
738
+ readonly additionalProperties: false;
739
+ readonly required: readonly ["scope"];
740
+ readonly properties: {
741
+ readonly scope: {
742
+ readonly const: "none";
743
+ };
744
+ };
745
+ };
746
+ readonly KeyScopeAll: {
747
+ readonly title: "KeyScopeAll";
748
+ readonly description: "Every key the entry's act scope reaches.";
749
+ readonly type: "object";
750
+ readonly additionalProperties: false;
751
+ readonly required: readonly ["scope"];
752
+ readonly properties: {
753
+ readonly scope: {
754
+ readonly const: "all";
755
+ };
756
+ };
757
+ };
758
+ readonly ApproveCapabilityScope: {
759
+ readonly title: "ApproveCapabilityScope";
760
+ readonly 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.";
761
+ readonly oneOf: readonly [{
762
+ readonly $ref: "#/$defs/CapabilityScopeCeiling";
763
+ }, {
764
+ readonly $ref: "#/$defs/CapabilityScopeNone";
765
+ }, {
766
+ readonly $ref: "#/$defs/ApproveCapabilityScopeListed";
767
+ }];
768
+ };
769
+ readonly ApproveCapabilityScopeListed: {
770
+ readonly title: "ApproveCapabilityScopeListed";
771
+ readonly description: "Exactly the listed capabilities, intersected with the role's approve ceiling where the maintainer's roles define one.";
772
+ readonly type: "object";
773
+ readonly additionalProperties: false;
774
+ readonly required: readonly ["scope", "grants"];
775
+ readonly properties: {
776
+ readonly scope: {
777
+ readonly const: "listed";
778
+ };
779
+ readonly grants: {
780
+ readonly type: "array";
781
+ readonly minItems: 1;
782
+ readonly items: {
783
+ readonly $ref: "#/$defs/CapabilityRef";
784
+ };
785
+ readonly description: "Non-empty list of approvable capabilities. An empty array is invalid.";
786
+ };
787
+ };
788
+ };
789
+ readonly CapabilityRef: {
790
+ readonly title: "CapabilityRef";
791
+ readonly 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.";
792
+ readonly type: "object";
793
+ readonly additionalProperties: false;
794
+ readonly required: readonly ["capability"];
795
+ readonly properties: {
796
+ readonly capability: {
797
+ readonly $ref: "#/$defs/Capability";
798
+ };
799
+ readonly resource: {
800
+ readonly $ref: "#/$defs/ResourceQualifier";
801
+ readonly description: "Optional qualifier. Absent covers every resource of the capability's kind.";
802
+ };
803
+ };
804
+ };
805
+ readonly ResourceQualifier: {
806
+ readonly title: "ResourceQualifier";
807
+ readonly 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.";
808
+ readonly type: "string";
809
+ readonly minLength: 1;
810
+ readonly maxLength: 512;
811
+ };
812
+ readonly Capability: {
813
+ readonly title: "Capability";
814
+ readonly 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.";
815
+ readonly type: "string";
816
+ readonly minLength: 1;
817
+ readonly maxLength: 128;
818
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)*$";
819
+ };
820
+ readonly CapabilityScopeNone: {
821
+ readonly title: "CapabilityScopeNone";
822
+ readonly description: "No capabilities on this axis.";
823
+ readonly type: "object";
824
+ readonly additionalProperties: false;
825
+ readonly required: readonly ["scope"];
826
+ readonly properties: {
827
+ readonly scope: {
828
+ readonly const: "none";
829
+ };
830
+ };
831
+ };
832
+ readonly CapabilityScopeCeiling: {
833
+ readonly title: "CapabilityScopeCeiling";
834
+ readonly 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\".";
835
+ readonly type: "object";
836
+ readonly additionalProperties: false;
837
+ readonly required: readonly ["scope"];
838
+ readonly properties: {
839
+ readonly scope: {
840
+ readonly const: "ceiling";
841
+ };
842
+ };
843
+ };
844
+ readonly CapabilityScope: {
845
+ readonly title: "CapabilityScope";
846
+ readonly 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.";
847
+ readonly oneOf: readonly [{
848
+ readonly $ref: "#/$defs/CapabilityScopeCeiling";
849
+ }, {
850
+ readonly $ref: "#/$defs/CapabilityScopeNone";
851
+ }, {
852
+ readonly $ref: "#/$defs/CapabilityScopeListed";
853
+ }];
854
+ };
855
+ readonly CapabilityScopeListed: {
856
+ readonly title: "CapabilityScopeListed";
857
+ readonly description: "Exactly the listed grants: (role ceiling ∩ non-additive grants) ∪ additive grants.";
858
+ readonly type: "object";
859
+ readonly additionalProperties: false;
860
+ readonly required: readonly ["scope", "grants"];
861
+ readonly properties: {
862
+ readonly scope: {
863
+ readonly const: "listed";
864
+ };
865
+ readonly grants: {
866
+ readonly type: "array";
867
+ readonly minItems: 1;
868
+ readonly items: {
869
+ readonly $ref: "#/$defs/CapabilityGrant";
870
+ };
871
+ readonly description: "Non-empty list of capability grants. An empty array is invalid (it is neither `ceiling` nor `none`).";
872
+ };
873
+ };
874
+ };
875
+ readonly CapabilityGrant: {
876
+ readonly title: "CapabilityGrant";
877
+ readonly 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.";
878
+ readonly type: "object";
879
+ readonly additionalProperties: false;
880
+ readonly required: readonly ["capability"];
881
+ readonly properties: {
882
+ readonly capability: {
883
+ readonly $ref: "#/$defs/Capability";
884
+ };
885
+ readonly resource: {
886
+ readonly $ref: "#/$defs/ResourceQualifier";
887
+ readonly description: "Optional qualifier. Absent covers every resource of the capability's kind.";
888
+ };
889
+ readonly additive: {
890
+ readonly type: "boolean";
891
+ readonly 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.";
892
+ };
893
+ };
894
+ };
895
+ readonly AuthorityScope: {
896
+ readonly title: "AuthorityScope";
897
+ readonly 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.";
898
+ readonly oneOf: readonly [{
899
+ readonly $ref: "#/$defs/AuthorityScopeAll";
900
+ }, {
901
+ readonly $ref: "#/$defs/AuthorityScopeNone";
902
+ }, {
903
+ readonly $ref: "#/$defs/AuthorityScopeContexts";
904
+ }];
905
+ };
906
+ readonly AuthorityScopeContexts: {
907
+ readonly title: "AuthorityScopeContexts";
908
+ readonly 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.";
909
+ readonly type: "object";
910
+ readonly additionalProperties: false;
911
+ readonly required: readonly ["scope", "contexts"];
912
+ readonly properties: {
913
+ readonly scope: {
914
+ readonly const: "contexts";
915
+ };
916
+ readonly contexts: {
917
+ readonly type: "array";
918
+ readonly minItems: 1;
919
+ readonly uniqueItems: true;
920
+ readonly items: {
921
+ readonly $ref: "#/$defs/ContextPath";
922
+ };
923
+ readonly description: "Non-empty set of context paths. An empty array is invalid (it is neither `all` nor `none`).";
924
+ };
925
+ };
926
+ };
927
+ readonly ContextPath: {
928
+ readonly title: "ContextPath";
929
+ readonly description: "Opaque identifier of one of the maintainer's contexts, compared by the maintainer's own ancestry predicate. Its grammar is the maintainer's.";
930
+ readonly type: "string";
931
+ readonly minLength: 1;
932
+ readonly maxLength: 512;
933
+ };
934
+ readonly AuthorityScopeNone: {
935
+ readonly title: "AuthorityScopeNone";
936
+ readonly 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.";
937
+ readonly type: "object";
938
+ readonly additionalProperties: false;
939
+ readonly required: readonly ["scope"];
940
+ readonly properties: {
941
+ readonly scope: {
942
+ readonly const: "none";
943
+ };
944
+ };
945
+ };
946
+ readonly AuthorityScopeAll: {
947
+ readonly title: "AuthorityScopeAll";
948
+ readonly 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).";
949
+ readonly type: "object";
950
+ readonly additionalProperties: false;
951
+ readonly required: readonly ["scope"];
952
+ readonly properties: {
953
+ readonly scope: {
954
+ readonly const: "all";
955
+ };
956
+ };
957
+ };
958
+ };
959
+ };
960
+ /**
961
+ * SPEC.md §7.2 policy for the request variant, from this specification's
962
+ * front matter. Pass to `consumeInbound` — items 5b, 7 and 8 are
963
+ * per-specification and cannot be derived from the document alone, and
964
+ * item 2 needs the schema this carries.
965
+ */
966
+ export declare const SPEC: {
967
+ readonly typeUri: "https://trusttasks.org/spec/acl/list/0.2";
968
+ readonly isBearer: false;
969
+ readonly isProofRequired: false;
970
+ readonly isRecipientRequired: true;
971
+ readonly isIssuedAtRequired: false;
972
+ readonly payloadSchema: {
973
+ readonly $schema: "https://json-schema.org/draft/2020-12/schema";
974
+ readonly $id: "https://trusttasks.org/spec/acl/list/0.2";
975
+ readonly title: "ACL List 0.2 — payload";
976
+ readonly description: "Enumerate the AclEntry 0.2 records a maintainer holds, with optional conjunctive filters and paging. A hierarchical filter (`context`, `resource`) MUST state its `direction`; there is no default direction. The outer document members are owned by the framework — SPEC §6.3.";
977
+ readonly type: "object";
978
+ readonly additionalProperties: false;
979
+ readonly dependentRequired: {
980
+ readonly context: readonly ["direction"];
981
+ readonly resource: readonly ["direction"];
982
+ };
983
+ readonly dependentSchemas: {
984
+ readonly direction: {
985
+ readonly anyOf: readonly [{
986
+ readonly required: readonly ["context"];
987
+ }, {
988
+ readonly required: readonly ["resource"];
989
+ }];
990
+ };
991
+ };
992
+ readonly properties: {
993
+ readonly role: {
994
+ readonly type: "string";
995
+ readonly minLength: 1;
996
+ readonly description: "Optional filter — only entries with this role are returned.";
997
+ };
998
+ readonly context: {
999
+ readonly $ref: "#/$defs/ContextPath";
1000
+ readonly description: "Optional filter on the entries' ACT scope, read in the stated `direction`. REQUIRES `direction`. Replaces 0.1's `scope` filter.";
1001
+ };
1002
+ readonly capability: {
1003
+ readonly $ref: "#/$defs/Capability";
1004
+ readonly description: "Optional filter — only entries whose EFFECTIVE capability set includes this capability (the role's full ceiling for `capabilities: {scope: ceiling}`, nothing for `none`, and for `listed` the ceiling ∩ the non-additive grants plus the additive grants). Combined with `resource`, the capability must be held at a qualifier related to that resource by `direction`.";
1005
+ };
1006
+ readonly resource: {
1007
+ readonly $ref: "#/$defs/ResourceQualifier";
1008
+ readonly description: "Optional filter on the resource qualifiers of the entries' effective capabilities (of `capability` when given, of any capability otherwise), read in the stated `direction`. REQUIRES `direction`.";
1009
+ };
1010
+ readonly direction: {
1011
+ readonly type: "string";
1012
+ readonly enum: readonly ["actingIn", "subtree", "any"];
1013
+ readonly description: "How to read a hierarchical filter (`context`, `resource`). REQUIRED when either is present and REFUSED when neither is: `actingIn` — entries whose scope or qualifier is an ancestor-or-self of the queried one, i.e. who may act IN it (unrestricted act scopes and unqualified capabilities match); `subtree` — entries holding a grant at or BENEATH the queried one (an unrestricted act scope or an unqualified capability does NOT match, and an entry naming contexts both inside and outside the subtree DOES); `any` — the union. Same three questions as 0.1's `acting-in` / `subtree` / `any`, re-cased to lowerCamelCase, with no default.";
1014
+ };
1015
+ readonly subjectPrefix: {
1016
+ readonly type: "string";
1017
+ readonly minLength: 1;
1018
+ readonly description: "Optional filter — only entries whose subject VID starts with this prefix are returned.";
1019
+ };
1020
+ readonly pageSize: {
1021
+ readonly type: "integer";
1022
+ readonly minimum: 1;
1023
+ readonly maximum: 1000;
1024
+ readonly description: "Maximum number of entries to return. Maintainer-defined default and ceiling.";
1025
+ };
1026
+ readonly cursor: {
1027
+ readonly type: "string";
1028
+ readonly minLength: 1;
1029
+ readonly maxLength: 2048;
1030
+ readonly description: "Opaque continuation token returned by the maintainer in a previous response. It binds the filters and `direction` it was minted under; a follow-up request MUST repeat them unchanged.";
1031
+ };
1032
+ readonly ext: {
1033
+ readonly $ref: "#/$defs/Ext";
1034
+ readonly description: "Ecosystem-defined extension members per SPEC.md §4.5.1.";
1035
+ };
1036
+ };
1037
+ readonly $defs: {
1038
+ readonly Response: {
1039
+ readonly $anchor: "response";
1040
+ readonly title: "ACL List 0.2 — response payload";
1041
+ readonly description: "The success response to an acl/list/0.2 request. Carried in a Trust Task document whose type is https://trusttasks.org/spec/acl/list/0.2#response.";
1042
+ readonly type: "object";
1043
+ readonly additionalProperties: false;
1044
+ readonly required: readonly ["entries", "truncated"];
1045
+ readonly properties: {
1046
+ readonly entries: {
1047
+ readonly type: "array";
1048
+ readonly items: {
1049
+ readonly $ref: "#/$defs/AclEntry";
1050
+ };
1051
+ readonly description: "Matching AclEntry items, in maintainer-defined order. May be empty.";
1052
+ };
1053
+ readonly truncated: {
1054
+ readonly type: "boolean";
1055
+ readonly description: "true when more matching entries exist beyond `entries`; false when this response is the complete result. Independent of `cursor`: a maintainer MAY truncate without supporting pagination, in which case `truncated` is true and `cursor` is absent.";
1056
+ };
1057
+ readonly cursor: {
1058
+ readonly type: "string";
1059
+ readonly minLength: 1;
1060
+ readonly maxLength: 2048;
1061
+ readonly description: "Opaque continuation token to fetch the next page. Present only when `truncated` is true AND the maintainer supports pagination from this point. Binds the request's filters and direction. Consumers MUST treat it as opaque and re-send it verbatim.";
1062
+ };
1063
+ readonly redactedFields: {
1064
+ readonly type: "array";
1065
+ readonly items: {
1066
+ readonly type: "string";
1067
+ readonly minLength: 1;
1068
+ };
1069
+ readonly description: "Names of AclEntry members the maintainer redacted from every returned entry. `act`, `keys` and `capabilities` are never redacted; `approve` and `approveCapabilities` SHOULD NOT be (see acl/show/0.2).";
1070
+ };
1071
+ readonly ext: {
1072
+ readonly $ref: "#/$defs/Ext";
1073
+ readonly description: "Ecosystem-defined extension members per SPEC.md §4.5.1.";
1074
+ };
1075
+ };
1076
+ };
1077
+ readonly Ext: {
1078
+ readonly title: "Ext";
1079
+ readonly 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.";
1080
+ readonly type: "object";
1081
+ readonly minProperties: 1;
1082
+ readonly additionalProperties: true;
1083
+ readonly propertyNames: {
1084
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
1085
+ };
1086
+ };
1087
+ readonly AclEntry: {
1088
+ readonly title: "AclEntry";
1089
+ readonly 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.";
1090
+ readonly type: "object";
1091
+ readonly additionalProperties: false;
1092
+ readonly required: readonly ["subject", "role", "act", "keys", "capabilities"];
1093
+ readonly properties: {
1094
+ readonly subject: {
1095
+ readonly type: "string";
1096
+ readonly minLength: 1;
1097
+ readonly description: "VID of the party in the ACL. Compared by exact string equality (SPEC.md §4.8); producers SHOULD emit canonical form.";
1098
+ };
1099
+ readonly role: {
1100
+ readonly type: "string";
1101
+ readonly minLength: 1;
1102
+ readonly 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.";
1103
+ };
1104
+ readonly act: {
1105
+ readonly $ref: "#/$defs/AuthorityScope";
1106
+ readonly 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`.";
1107
+ };
1108
+ readonly approve: {
1109
+ readonly $ref: "#/$defs/AuthorityScope";
1110
+ readonly 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}`.";
1111
+ };
1112
+ readonly capabilities: {
1113
+ readonly $ref: "#/$defs/CapabilityScope";
1114
+ readonly 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.";
1115
+ };
1116
+ readonly approveCapabilities: {
1117
+ readonly $ref: "#/$defs/ApproveCapabilityScope";
1118
+ readonly 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.";
1119
+ };
1120
+ readonly delegatedBy: {
1121
+ readonly type: "string";
1122
+ readonly minLength: 1;
1123
+ readonly 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).";
1124
+ };
1125
+ readonly keys: {
1126
+ readonly $ref: "#/$defs/KeyScope";
1127
+ readonly 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.";
1128
+ };
1129
+ readonly label: {
1130
+ readonly type: "string";
1131
+ readonly maxLength: 256;
1132
+ readonly description: "Optional human-readable label. Confers nothing.";
1133
+ };
1134
+ readonly createdAt: {
1135
+ readonly type: "string";
1136
+ readonly format: "date-time";
1137
+ };
1138
+ readonly createdBy: {
1139
+ readonly type: "string";
1140
+ readonly description: "VID of the party that originally wrote this entry.";
1141
+ };
1142
+ readonly updatedAt: {
1143
+ readonly type: "string";
1144
+ readonly format: "date-time";
1145
+ };
1146
+ readonly updatedBy: {
1147
+ readonly type: "string";
1148
+ readonly description: "VID of the party that last modified this entry.";
1149
+ };
1150
+ readonly expiresAt: {
1151
+ readonly type: "string";
1152
+ readonly format: "date-time";
1153
+ readonly description: "Optional time after which the entry confers no authority. Evaluated at every authorization decision, not only when a session is established.";
1154
+ };
1155
+ readonly stepUp: {
1156
+ readonly type: "object";
1157
+ readonly additionalProperties: false;
1158
+ readonly 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.";
1159
+ readonly properties: {
1160
+ readonly approver: {
1161
+ readonly type: "string";
1162
+ readonly 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.";
1163
+ };
1164
+ readonly require: {
1165
+ readonly type: "string";
1166
+ readonly enum: readonly ["self", "delegated"];
1167
+ readonly 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).";
1168
+ };
1169
+ };
1170
+ };
1171
+ readonly ext: {
1172
+ readonly $ref: "#/$defs/Ext";
1173
+ readonly 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.";
1174
+ };
1175
+ };
1176
+ };
1177
+ readonly KeyScope: {
1178
+ readonly title: "KeyScope";
1179
+ readonly 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.";
1180
+ readonly oneOf: readonly [{
1181
+ readonly $ref: "#/$defs/KeyScopeAll";
1182
+ }, {
1183
+ readonly $ref: "#/$defs/KeyScopeNone";
1184
+ }, {
1185
+ readonly $ref: "#/$defs/KeyScopeListed";
1186
+ }];
1187
+ };
1188
+ readonly KeyScopeListed: {
1189
+ readonly title: "KeyScopeListed";
1190
+ readonly description: "Exactly the listed keys, intersected with the entry's act scope.";
1191
+ readonly type: "object";
1192
+ readonly additionalProperties: false;
1193
+ readonly required: readonly ["scope", "keys"];
1194
+ readonly properties: {
1195
+ readonly scope: {
1196
+ readonly const: "listed";
1197
+ };
1198
+ readonly keys: {
1199
+ readonly type: "array";
1200
+ readonly minItems: 1;
1201
+ readonly uniqueItems: true;
1202
+ readonly items: {
1203
+ readonly type: "string";
1204
+ readonly minLength: 1;
1205
+ readonly maxLength: 512;
1206
+ };
1207
+ readonly description: "Non-empty set of key identifiers. An empty array is invalid (it is neither `all` nor `none`).";
1208
+ };
1209
+ };
1210
+ };
1211
+ readonly KeyScopeNone: {
1212
+ readonly title: "KeyScopeNone";
1213
+ readonly description: "No keys.";
1214
+ readonly type: "object";
1215
+ readonly additionalProperties: false;
1216
+ readonly required: readonly ["scope"];
1217
+ readonly properties: {
1218
+ readonly scope: {
1219
+ readonly const: "none";
1220
+ };
1221
+ };
1222
+ };
1223
+ readonly KeyScopeAll: {
1224
+ readonly title: "KeyScopeAll";
1225
+ readonly description: "Every key the entry's act scope reaches.";
1226
+ readonly type: "object";
1227
+ readonly additionalProperties: false;
1228
+ readonly required: readonly ["scope"];
1229
+ readonly properties: {
1230
+ readonly scope: {
1231
+ readonly const: "all";
1232
+ };
1233
+ };
1234
+ };
1235
+ readonly ApproveCapabilityScope: {
1236
+ readonly title: "ApproveCapabilityScope";
1237
+ readonly 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.";
1238
+ readonly oneOf: readonly [{
1239
+ readonly $ref: "#/$defs/CapabilityScopeCeiling";
1240
+ }, {
1241
+ readonly $ref: "#/$defs/CapabilityScopeNone";
1242
+ }, {
1243
+ readonly $ref: "#/$defs/ApproveCapabilityScopeListed";
1244
+ }];
1245
+ };
1246
+ readonly ApproveCapabilityScopeListed: {
1247
+ readonly title: "ApproveCapabilityScopeListed";
1248
+ readonly description: "Exactly the listed capabilities, intersected with the role's approve ceiling where the maintainer's roles define one.";
1249
+ readonly type: "object";
1250
+ readonly additionalProperties: false;
1251
+ readonly required: readonly ["scope", "grants"];
1252
+ readonly properties: {
1253
+ readonly scope: {
1254
+ readonly const: "listed";
1255
+ };
1256
+ readonly grants: {
1257
+ readonly type: "array";
1258
+ readonly minItems: 1;
1259
+ readonly items: {
1260
+ readonly $ref: "#/$defs/CapabilityRef";
1261
+ };
1262
+ readonly description: "Non-empty list of approvable capabilities. An empty array is invalid.";
1263
+ };
1264
+ };
1265
+ };
1266
+ readonly CapabilityRef: {
1267
+ readonly title: "CapabilityRef";
1268
+ readonly 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.";
1269
+ readonly type: "object";
1270
+ readonly additionalProperties: false;
1271
+ readonly required: readonly ["capability"];
1272
+ readonly properties: {
1273
+ readonly capability: {
1274
+ readonly $ref: "#/$defs/Capability";
1275
+ };
1276
+ readonly resource: {
1277
+ readonly $ref: "#/$defs/ResourceQualifier";
1278
+ readonly description: "Optional qualifier. Absent covers every resource of the capability's kind.";
1279
+ };
1280
+ };
1281
+ };
1282
+ readonly ResourceQualifier: {
1283
+ readonly title: "ResourceQualifier";
1284
+ readonly 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.";
1285
+ readonly type: "string";
1286
+ readonly minLength: 1;
1287
+ readonly maxLength: 512;
1288
+ };
1289
+ readonly Capability: {
1290
+ readonly title: "Capability";
1291
+ readonly 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.";
1292
+ readonly type: "string";
1293
+ readonly minLength: 1;
1294
+ readonly maxLength: 128;
1295
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)*$";
1296
+ };
1297
+ readonly CapabilityScopeNone: {
1298
+ readonly title: "CapabilityScopeNone";
1299
+ readonly description: "No capabilities on this axis.";
1300
+ readonly type: "object";
1301
+ readonly additionalProperties: false;
1302
+ readonly required: readonly ["scope"];
1303
+ readonly properties: {
1304
+ readonly scope: {
1305
+ readonly const: "none";
1306
+ };
1307
+ };
1308
+ };
1309
+ readonly CapabilityScopeCeiling: {
1310
+ readonly title: "CapabilityScopeCeiling";
1311
+ readonly 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\".";
1312
+ readonly type: "object";
1313
+ readonly additionalProperties: false;
1314
+ readonly required: readonly ["scope"];
1315
+ readonly properties: {
1316
+ readonly scope: {
1317
+ readonly const: "ceiling";
1318
+ };
1319
+ };
1320
+ };
1321
+ readonly CapabilityScope: {
1322
+ readonly title: "CapabilityScope";
1323
+ readonly 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.";
1324
+ readonly oneOf: readonly [{
1325
+ readonly $ref: "#/$defs/CapabilityScopeCeiling";
1326
+ }, {
1327
+ readonly $ref: "#/$defs/CapabilityScopeNone";
1328
+ }, {
1329
+ readonly $ref: "#/$defs/CapabilityScopeListed";
1330
+ }];
1331
+ };
1332
+ readonly CapabilityScopeListed: {
1333
+ readonly title: "CapabilityScopeListed";
1334
+ readonly description: "Exactly the listed grants: (role ceiling ∩ non-additive grants) ∪ additive grants.";
1335
+ readonly type: "object";
1336
+ readonly additionalProperties: false;
1337
+ readonly required: readonly ["scope", "grants"];
1338
+ readonly properties: {
1339
+ readonly scope: {
1340
+ readonly const: "listed";
1341
+ };
1342
+ readonly grants: {
1343
+ readonly type: "array";
1344
+ readonly minItems: 1;
1345
+ readonly items: {
1346
+ readonly $ref: "#/$defs/CapabilityGrant";
1347
+ };
1348
+ readonly description: "Non-empty list of capability grants. An empty array is invalid (it is neither `ceiling` nor `none`).";
1349
+ };
1350
+ };
1351
+ };
1352
+ readonly CapabilityGrant: {
1353
+ readonly title: "CapabilityGrant";
1354
+ readonly 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.";
1355
+ readonly type: "object";
1356
+ readonly additionalProperties: false;
1357
+ readonly required: readonly ["capability"];
1358
+ readonly properties: {
1359
+ readonly capability: {
1360
+ readonly $ref: "#/$defs/Capability";
1361
+ };
1362
+ readonly resource: {
1363
+ readonly $ref: "#/$defs/ResourceQualifier";
1364
+ readonly description: "Optional qualifier. Absent covers every resource of the capability's kind.";
1365
+ };
1366
+ readonly additive: {
1367
+ readonly type: "boolean";
1368
+ readonly 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.";
1369
+ };
1370
+ };
1371
+ };
1372
+ readonly AuthorityScope: {
1373
+ readonly title: "AuthorityScope";
1374
+ readonly 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.";
1375
+ readonly oneOf: readonly [{
1376
+ readonly $ref: "#/$defs/AuthorityScopeAll";
1377
+ }, {
1378
+ readonly $ref: "#/$defs/AuthorityScopeNone";
1379
+ }, {
1380
+ readonly $ref: "#/$defs/AuthorityScopeContexts";
1381
+ }];
1382
+ };
1383
+ readonly AuthorityScopeContexts: {
1384
+ readonly title: "AuthorityScopeContexts";
1385
+ readonly 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.";
1386
+ readonly type: "object";
1387
+ readonly additionalProperties: false;
1388
+ readonly required: readonly ["scope", "contexts"];
1389
+ readonly properties: {
1390
+ readonly scope: {
1391
+ readonly const: "contexts";
1392
+ };
1393
+ readonly contexts: {
1394
+ readonly type: "array";
1395
+ readonly minItems: 1;
1396
+ readonly uniqueItems: true;
1397
+ readonly items: {
1398
+ readonly $ref: "#/$defs/ContextPath";
1399
+ };
1400
+ readonly description: "Non-empty set of context paths. An empty array is invalid (it is neither `all` nor `none`).";
1401
+ };
1402
+ };
1403
+ };
1404
+ readonly ContextPath: {
1405
+ readonly title: "ContextPath";
1406
+ readonly description: "Opaque identifier of one of the maintainer's contexts, compared by the maintainer's own ancestry predicate. Its grammar is the maintainer's.";
1407
+ readonly type: "string";
1408
+ readonly minLength: 1;
1409
+ readonly maxLength: 512;
1410
+ };
1411
+ readonly AuthorityScopeNone: {
1412
+ readonly title: "AuthorityScopeNone";
1413
+ readonly 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.";
1414
+ readonly type: "object";
1415
+ readonly additionalProperties: false;
1416
+ readonly required: readonly ["scope"];
1417
+ readonly properties: {
1418
+ readonly scope: {
1419
+ readonly const: "none";
1420
+ };
1421
+ };
1422
+ };
1423
+ readonly AuthorityScopeAll: {
1424
+ readonly title: "AuthorityScopeAll";
1425
+ readonly 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).";
1426
+ readonly type: "object";
1427
+ readonly additionalProperties: false;
1428
+ readonly required: readonly ["scope"];
1429
+ readonly properties: {
1430
+ readonly scope: {
1431
+ readonly const: "all";
1432
+ };
1433
+ };
1434
+ };
1435
+ };
1436
+ };
1437
+ };
1438
+ /**
1439
+ * SPEC.md §7.2 policy for the success-response variant. `isRecipientRequired`
1440
+ * tracks the *issuer* party's requirement because a response swaps the
1441
+ * parties (§7.3 item 5).
1442
+ */
1443
+ export declare const RESPONSE_SPEC: {
1444
+ readonly typeUri: "https://trusttasks.org/spec/acl/list/0.2#response";
1445
+ readonly isBearer: false;
1446
+ readonly isProofRequired: false;
1447
+ readonly isRecipientRequired: true;
1448
+ readonly isIssuedAtRequired: false;
1449
+ readonly payloadSchema: {
1450
+ readonly $schema: "https://json-schema.org/draft/2020-12/schema";
1451
+ readonly $ref: "#/$defs/Response";
1452
+ readonly $defs: {
1453
+ readonly Response: {
1454
+ readonly $anchor: "response";
1455
+ readonly title: "ACL List 0.2 — response payload";
1456
+ readonly description: "The success response to an acl/list/0.2 request. Carried in a Trust Task document whose type is https://trusttasks.org/spec/acl/list/0.2#response.";
1457
+ readonly type: "object";
1458
+ readonly additionalProperties: false;
1459
+ readonly required: readonly ["entries", "truncated"];
1460
+ readonly properties: {
1461
+ readonly entries: {
1462
+ readonly type: "array";
1463
+ readonly items: {
1464
+ readonly $ref: "#/$defs/AclEntry";
1465
+ };
1466
+ readonly description: "Matching AclEntry items, in maintainer-defined order. May be empty.";
1467
+ };
1468
+ readonly truncated: {
1469
+ readonly type: "boolean";
1470
+ readonly description: "true when more matching entries exist beyond `entries`; false when this response is the complete result. Independent of `cursor`: a maintainer MAY truncate without supporting pagination, in which case `truncated` is true and `cursor` is absent.";
1471
+ };
1472
+ readonly cursor: {
1473
+ readonly type: "string";
1474
+ readonly minLength: 1;
1475
+ readonly maxLength: 2048;
1476
+ readonly description: "Opaque continuation token to fetch the next page. Present only when `truncated` is true AND the maintainer supports pagination from this point. Binds the request's filters and direction. Consumers MUST treat it as opaque and re-send it verbatim.";
1477
+ };
1478
+ readonly redactedFields: {
1479
+ readonly type: "array";
1480
+ readonly items: {
1481
+ readonly type: "string";
1482
+ readonly minLength: 1;
1483
+ };
1484
+ readonly description: "Names of AclEntry members the maintainer redacted from every returned entry. `act`, `keys` and `capabilities` are never redacted; `approve` and `approveCapabilities` SHOULD NOT be (see acl/show/0.2).";
1485
+ };
1486
+ readonly ext: {
1487
+ readonly $ref: "#/$defs/Ext";
1488
+ readonly description: "Ecosystem-defined extension members per SPEC.md §4.5.1.";
1489
+ };
1490
+ };
1491
+ };
1492
+ readonly Ext: {
1493
+ readonly title: "Ext";
1494
+ readonly 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.";
1495
+ readonly type: "object";
1496
+ readonly minProperties: 1;
1497
+ readonly additionalProperties: true;
1498
+ readonly propertyNames: {
1499
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
1500
+ };
1501
+ };
1502
+ readonly AclEntry: {
1503
+ readonly title: "AclEntry";
1504
+ readonly 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.";
1505
+ readonly type: "object";
1506
+ readonly additionalProperties: false;
1507
+ readonly required: readonly ["subject", "role", "act", "keys", "capabilities"];
1508
+ readonly properties: {
1509
+ readonly subject: {
1510
+ readonly type: "string";
1511
+ readonly minLength: 1;
1512
+ readonly description: "VID of the party in the ACL. Compared by exact string equality (SPEC.md §4.8); producers SHOULD emit canonical form.";
1513
+ };
1514
+ readonly role: {
1515
+ readonly type: "string";
1516
+ readonly minLength: 1;
1517
+ readonly 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.";
1518
+ };
1519
+ readonly act: {
1520
+ readonly $ref: "#/$defs/AuthorityScope";
1521
+ readonly 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`.";
1522
+ };
1523
+ readonly approve: {
1524
+ readonly $ref: "#/$defs/AuthorityScope";
1525
+ readonly 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}`.";
1526
+ };
1527
+ readonly capabilities: {
1528
+ readonly $ref: "#/$defs/CapabilityScope";
1529
+ readonly 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.";
1530
+ };
1531
+ readonly approveCapabilities: {
1532
+ readonly $ref: "#/$defs/ApproveCapabilityScope";
1533
+ readonly 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.";
1534
+ };
1535
+ readonly delegatedBy: {
1536
+ readonly type: "string";
1537
+ readonly minLength: 1;
1538
+ readonly 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).";
1539
+ };
1540
+ readonly keys: {
1541
+ readonly $ref: "#/$defs/KeyScope";
1542
+ readonly 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.";
1543
+ };
1544
+ readonly label: {
1545
+ readonly type: "string";
1546
+ readonly maxLength: 256;
1547
+ readonly description: "Optional human-readable label. Confers nothing.";
1548
+ };
1549
+ readonly createdAt: {
1550
+ readonly type: "string";
1551
+ readonly format: "date-time";
1552
+ };
1553
+ readonly createdBy: {
1554
+ readonly type: "string";
1555
+ readonly description: "VID of the party that originally wrote this entry.";
1556
+ };
1557
+ readonly updatedAt: {
1558
+ readonly type: "string";
1559
+ readonly format: "date-time";
1560
+ };
1561
+ readonly updatedBy: {
1562
+ readonly type: "string";
1563
+ readonly description: "VID of the party that last modified this entry.";
1564
+ };
1565
+ readonly expiresAt: {
1566
+ readonly type: "string";
1567
+ readonly format: "date-time";
1568
+ readonly description: "Optional time after which the entry confers no authority. Evaluated at every authorization decision, not only when a session is established.";
1569
+ };
1570
+ readonly stepUp: {
1571
+ readonly type: "object";
1572
+ readonly additionalProperties: false;
1573
+ readonly 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.";
1574
+ readonly properties: {
1575
+ readonly approver: {
1576
+ readonly type: "string";
1577
+ readonly 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.";
1578
+ };
1579
+ readonly require: {
1580
+ readonly type: "string";
1581
+ readonly enum: readonly ["self", "delegated"];
1582
+ readonly 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).";
1583
+ };
1584
+ };
1585
+ };
1586
+ readonly ext: {
1587
+ readonly $ref: "#/$defs/Ext";
1588
+ readonly 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.";
1589
+ };
1590
+ };
1591
+ };
1592
+ readonly KeyScope: {
1593
+ readonly title: "KeyScope";
1594
+ readonly 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.";
1595
+ readonly oneOf: readonly [{
1596
+ readonly $ref: "#/$defs/KeyScopeAll";
1597
+ }, {
1598
+ readonly $ref: "#/$defs/KeyScopeNone";
1599
+ }, {
1600
+ readonly $ref: "#/$defs/KeyScopeListed";
1601
+ }];
1602
+ };
1603
+ readonly KeyScopeListed: {
1604
+ readonly title: "KeyScopeListed";
1605
+ readonly description: "Exactly the listed keys, intersected with the entry's act scope.";
1606
+ readonly type: "object";
1607
+ readonly additionalProperties: false;
1608
+ readonly required: readonly ["scope", "keys"];
1609
+ readonly properties: {
1610
+ readonly scope: {
1611
+ readonly const: "listed";
1612
+ };
1613
+ readonly keys: {
1614
+ readonly type: "array";
1615
+ readonly minItems: 1;
1616
+ readonly uniqueItems: true;
1617
+ readonly items: {
1618
+ readonly type: "string";
1619
+ readonly minLength: 1;
1620
+ readonly maxLength: 512;
1621
+ };
1622
+ readonly description: "Non-empty set of key identifiers. An empty array is invalid (it is neither `all` nor `none`).";
1623
+ };
1624
+ };
1625
+ };
1626
+ readonly KeyScopeNone: {
1627
+ readonly title: "KeyScopeNone";
1628
+ readonly description: "No keys.";
1629
+ readonly type: "object";
1630
+ readonly additionalProperties: false;
1631
+ readonly required: readonly ["scope"];
1632
+ readonly properties: {
1633
+ readonly scope: {
1634
+ readonly const: "none";
1635
+ };
1636
+ };
1637
+ };
1638
+ readonly KeyScopeAll: {
1639
+ readonly title: "KeyScopeAll";
1640
+ readonly description: "Every key the entry's act scope reaches.";
1641
+ readonly type: "object";
1642
+ readonly additionalProperties: false;
1643
+ readonly required: readonly ["scope"];
1644
+ readonly properties: {
1645
+ readonly scope: {
1646
+ readonly const: "all";
1647
+ };
1648
+ };
1649
+ };
1650
+ readonly ApproveCapabilityScope: {
1651
+ readonly title: "ApproveCapabilityScope";
1652
+ readonly 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.";
1653
+ readonly oneOf: readonly [{
1654
+ readonly $ref: "#/$defs/CapabilityScopeCeiling";
1655
+ }, {
1656
+ readonly $ref: "#/$defs/CapabilityScopeNone";
1657
+ }, {
1658
+ readonly $ref: "#/$defs/ApproveCapabilityScopeListed";
1659
+ }];
1660
+ };
1661
+ readonly ApproveCapabilityScopeListed: {
1662
+ readonly title: "ApproveCapabilityScopeListed";
1663
+ readonly description: "Exactly the listed capabilities, intersected with the role's approve ceiling where the maintainer's roles define one.";
1664
+ readonly type: "object";
1665
+ readonly additionalProperties: false;
1666
+ readonly required: readonly ["scope", "grants"];
1667
+ readonly properties: {
1668
+ readonly scope: {
1669
+ readonly const: "listed";
1670
+ };
1671
+ readonly grants: {
1672
+ readonly type: "array";
1673
+ readonly minItems: 1;
1674
+ readonly items: {
1675
+ readonly $ref: "#/$defs/CapabilityRef";
1676
+ };
1677
+ readonly description: "Non-empty list of approvable capabilities. An empty array is invalid.";
1678
+ };
1679
+ };
1680
+ };
1681
+ readonly CapabilityRef: {
1682
+ readonly title: "CapabilityRef";
1683
+ readonly 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.";
1684
+ readonly type: "object";
1685
+ readonly additionalProperties: false;
1686
+ readonly required: readonly ["capability"];
1687
+ readonly properties: {
1688
+ readonly capability: {
1689
+ readonly $ref: "#/$defs/Capability";
1690
+ };
1691
+ readonly resource: {
1692
+ readonly $ref: "#/$defs/ResourceQualifier";
1693
+ readonly description: "Optional qualifier. Absent covers every resource of the capability's kind.";
1694
+ };
1695
+ };
1696
+ };
1697
+ readonly ResourceQualifier: {
1698
+ readonly title: "ResourceQualifier";
1699
+ readonly 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.";
1700
+ readonly type: "string";
1701
+ readonly minLength: 1;
1702
+ readonly maxLength: 512;
1703
+ };
1704
+ readonly Capability: {
1705
+ readonly title: "Capability";
1706
+ readonly 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.";
1707
+ readonly type: "string";
1708
+ readonly minLength: 1;
1709
+ readonly maxLength: 128;
1710
+ readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)*$";
1711
+ };
1712
+ readonly CapabilityScopeNone: {
1713
+ readonly title: "CapabilityScopeNone";
1714
+ readonly description: "No capabilities on this axis.";
1715
+ readonly type: "object";
1716
+ readonly additionalProperties: false;
1717
+ readonly required: readonly ["scope"];
1718
+ readonly properties: {
1719
+ readonly scope: {
1720
+ readonly const: "none";
1721
+ };
1722
+ };
1723
+ };
1724
+ readonly CapabilityScopeCeiling: {
1725
+ readonly title: "CapabilityScopeCeiling";
1726
+ readonly 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\".";
1727
+ readonly type: "object";
1728
+ readonly additionalProperties: false;
1729
+ readonly required: readonly ["scope"];
1730
+ readonly properties: {
1731
+ readonly scope: {
1732
+ readonly const: "ceiling";
1733
+ };
1734
+ };
1735
+ };
1736
+ readonly CapabilityScope: {
1737
+ readonly title: "CapabilityScope";
1738
+ readonly 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.";
1739
+ readonly oneOf: readonly [{
1740
+ readonly $ref: "#/$defs/CapabilityScopeCeiling";
1741
+ }, {
1742
+ readonly $ref: "#/$defs/CapabilityScopeNone";
1743
+ }, {
1744
+ readonly $ref: "#/$defs/CapabilityScopeListed";
1745
+ }];
1746
+ };
1747
+ readonly CapabilityScopeListed: {
1748
+ readonly title: "CapabilityScopeListed";
1749
+ readonly description: "Exactly the listed grants: (role ceiling ∩ non-additive grants) ∪ additive grants.";
1750
+ readonly type: "object";
1751
+ readonly additionalProperties: false;
1752
+ readonly required: readonly ["scope", "grants"];
1753
+ readonly properties: {
1754
+ readonly scope: {
1755
+ readonly const: "listed";
1756
+ };
1757
+ readonly grants: {
1758
+ readonly type: "array";
1759
+ readonly minItems: 1;
1760
+ readonly items: {
1761
+ readonly $ref: "#/$defs/CapabilityGrant";
1762
+ };
1763
+ readonly description: "Non-empty list of capability grants. An empty array is invalid (it is neither `ceiling` nor `none`).";
1764
+ };
1765
+ };
1766
+ };
1767
+ readonly CapabilityGrant: {
1768
+ readonly title: "CapabilityGrant";
1769
+ readonly 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.";
1770
+ readonly type: "object";
1771
+ readonly additionalProperties: false;
1772
+ readonly required: readonly ["capability"];
1773
+ readonly properties: {
1774
+ readonly capability: {
1775
+ readonly $ref: "#/$defs/Capability";
1776
+ };
1777
+ readonly resource: {
1778
+ readonly $ref: "#/$defs/ResourceQualifier";
1779
+ readonly description: "Optional qualifier. Absent covers every resource of the capability's kind.";
1780
+ };
1781
+ readonly additive: {
1782
+ readonly type: "boolean";
1783
+ readonly 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.";
1784
+ };
1785
+ };
1786
+ };
1787
+ readonly AuthorityScope: {
1788
+ readonly title: "AuthorityScope";
1789
+ readonly 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.";
1790
+ readonly oneOf: readonly [{
1791
+ readonly $ref: "#/$defs/AuthorityScopeAll";
1792
+ }, {
1793
+ readonly $ref: "#/$defs/AuthorityScopeNone";
1794
+ }, {
1795
+ readonly $ref: "#/$defs/AuthorityScopeContexts";
1796
+ }];
1797
+ };
1798
+ readonly AuthorityScopeContexts: {
1799
+ readonly title: "AuthorityScopeContexts";
1800
+ readonly 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.";
1801
+ readonly type: "object";
1802
+ readonly additionalProperties: false;
1803
+ readonly required: readonly ["scope", "contexts"];
1804
+ readonly properties: {
1805
+ readonly scope: {
1806
+ readonly const: "contexts";
1807
+ };
1808
+ readonly contexts: {
1809
+ readonly type: "array";
1810
+ readonly minItems: 1;
1811
+ readonly uniqueItems: true;
1812
+ readonly items: {
1813
+ readonly $ref: "#/$defs/ContextPath";
1814
+ };
1815
+ readonly description: "Non-empty set of context paths. An empty array is invalid (it is neither `all` nor `none`).";
1816
+ };
1817
+ };
1818
+ };
1819
+ readonly ContextPath: {
1820
+ readonly title: "ContextPath";
1821
+ readonly description: "Opaque identifier of one of the maintainer's contexts, compared by the maintainer's own ancestry predicate. Its grammar is the maintainer's.";
1822
+ readonly type: "string";
1823
+ readonly minLength: 1;
1824
+ readonly maxLength: 512;
1825
+ };
1826
+ readonly AuthorityScopeNone: {
1827
+ readonly title: "AuthorityScopeNone";
1828
+ readonly 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.";
1829
+ readonly type: "object";
1830
+ readonly additionalProperties: false;
1831
+ readonly required: readonly ["scope"];
1832
+ readonly properties: {
1833
+ readonly scope: {
1834
+ readonly const: "none";
1835
+ };
1836
+ };
1837
+ };
1838
+ readonly AuthorityScopeAll: {
1839
+ readonly title: "AuthorityScopeAll";
1840
+ readonly 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).";
1841
+ readonly type: "object";
1842
+ readonly additionalProperties: false;
1843
+ readonly required: readonly ["scope"];
1844
+ readonly properties: {
1845
+ readonly scope: {
1846
+ readonly const: "all";
1847
+ };
1848
+ };
1849
+ };
1850
+ };
1851
+ };
1852
+ };
1853
+ //# sourceMappingURL=payload.d.ts.map