@openvtc/trust-tasks 0.20.8 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/CHANGELOG.md +233 -0
  2. package/dist/_shared/components.d.ts +299 -2
  3. package/dist/_shared/components.d.ts.map +1 -1
  4. package/dist/auth/passkey/enroll/invite/0.2/payload.d.ts +456 -0
  5. package/dist/auth/passkey/enroll/invite/0.2/payload.d.ts.map +1 -0
  6. package/dist/auth/passkey/enroll/invite/0.2/payload.js +248 -0
  7. package/dist/auth/passkey/enroll/invite/0.2/payload.js.map +1 -0
  8. package/dist/auth/passkey/enroll/redeem/finish/0.1/payload.d.ts +728 -0
  9. package/dist/auth/passkey/enroll/redeem/finish/0.1/payload.d.ts.map +1 -0
  10. package/dist/auth/passkey/enroll/redeem/finish/0.1/payload.js +430 -0
  11. package/dist/auth/passkey/enroll/redeem/finish/0.1/payload.js.map +1 -0
  12. package/dist/auth/passkey/enroll/redeem/start/0.1/payload.d.ts +1043 -0
  13. package/dist/auth/passkey/enroll/redeem/start/0.1/payload.d.ts.map +1 -0
  14. package/dist/auth/passkey/enroll/redeem/start/0.1/payload.js +628 -0
  15. package/dist/auth/passkey/enroll/redeem/start/0.1/payload.js.map +1 -0
  16. package/dist/auth/passkey/revoke/finish/0.2/payload.d.ts +533 -0
  17. package/dist/auth/passkey/revoke/finish/0.2/payload.d.ts.map +1 -0
  18. package/dist/auth/passkey/revoke/finish/0.2/payload.js +315 -0
  19. package/dist/auth/passkey/revoke/finish/0.2/payload.js.map +1 -0
  20. package/dist/auth/passkey/revoke/start/0.2/payload.d.ts +511 -0
  21. package/dist/auth/passkey/revoke/start/0.2/payload.d.ts.map +1 -0
  22. package/dist/auth/passkey/revoke/start/0.2/payload.js +297 -0
  23. package/dist/auth/passkey/revoke/start/0.2/payload.js.map +1 -0
  24. package/dist/auth/step-up/approve-response/0.5/payload.d.ts +887 -0
  25. package/dist/auth/step-up/approve-response/0.5/payload.d.ts.map +1 -0
  26. package/dist/auth/step-up/approve-response/0.5/payload.js +504 -0
  27. package/dist/auth/step-up/approve-response/0.5/payload.js.map +1 -0
  28. package/dist/device/list/0.1/payload.d.ts +4 -4
  29. package/dist/device/list/0.1/payload.d.ts.map +1 -1
  30. package/dist/device/list/0.1/payload.js +4 -2
  31. package/dist/device/list/0.1/payload.js.map +1 -1
  32. package/dist/device/list/0.2/payload.d.ts +4 -4
  33. package/dist/device/list/0.2/payload.d.ts.map +1 -1
  34. package/dist/device/list/0.2/payload.js +4 -2
  35. package/dist/device/list/0.2/payload.js.map +1 -1
  36. package/dist/device/register/0.1/payload.d.ts +4 -4
  37. package/dist/device/register/0.1/payload.d.ts.map +1 -1
  38. package/dist/device/register/0.1/payload.js +4 -2
  39. package/dist/device/register/0.1/payload.js.map +1 -1
  40. package/dist/device/register/0.2/payload.d.ts +4 -4
  41. package/dist/device/register/0.2/payload.d.ts.map +1 -1
  42. package/dist/device/register/0.2/payload.js +4 -2
  43. package/dist/device/register/0.2/payload.js.map +1 -1
  44. package/dist/git-ns/_shared/0.4/git-ns.d.ts +16 -0
  45. package/dist/git-ns/_shared/0.4/git-ns.d.ts.map +1 -0
  46. package/dist/git-ns/_shared/0.4/git-ns.js +6 -0
  47. package/dist/git-ns/_shared/0.4/git-ns.js.map +1 -0
  48. package/dist/git-ns/account/link-status/0.1/payload.d.ts +2 -2
  49. package/dist/git-ns/account/link-status/0.1/payload.js +2 -2
  50. package/dist/git-ns/account/link-status/0.1/payload.js.map +1 -1
  51. package/dist/git-ns/account/unlink/0.1/payload.d.ts +411 -0
  52. package/dist/git-ns/account/unlink/0.1/payload.d.ts.map +1 -0
  53. package/dist/git-ns/account/unlink/0.1/payload.js +228 -0
  54. package/dist/git-ns/account/unlink/0.1/payload.js.map +1 -0
  55. package/dist/git-ns/bridge/event/0.3/payload.d.ts +1682 -0
  56. package/dist/git-ns/bridge/event/0.3/payload.d.ts.map +1 -0
  57. package/dist/git-ns/bridge/event/0.3/payload.js +971 -0
  58. package/dist/git-ns/bridge/event/0.3/payload.js.map +1 -0
  59. package/dist/git-ns/bridge/job/0.4/payload.d.ts +1068 -0
  60. package/dist/git-ns/bridge/job/0.4/payload.d.ts.map +1 -0
  61. package/dist/git-ns/bridge/job/0.4/payload.js +573 -0
  62. package/dist/git-ns/bridge/job/0.4/payload.js.map +1 -0
  63. package/dist/git-ns/drift/resolve/0.3/payload.d.ts +1072 -0
  64. package/dist/git-ns/drift/resolve/0.3/payload.d.ts.map +1 -0
  65. package/dist/git-ns/drift/resolve/0.3/payload.js +634 -0
  66. package/dist/git-ns/drift/resolve/0.3/payload.js.map +1 -0
  67. package/dist/git-ns/namespace/reseat/0.3/payload.d.ts +515 -0
  68. package/dist/git-ns/namespace/reseat/0.3/payload.d.ts.map +1 -0
  69. package/dist/git-ns/namespace/reseat/0.3/payload.js +296 -0
  70. package/dist/git-ns/namespace/reseat/0.3/payload.js.map +1 -0
  71. package/dist/git-ns/repo/create/0.3/payload.d.ts +1101 -0
  72. package/dist/git-ns/repo/create/0.3/payload.d.ts.map +1 -0
  73. package/dist/git-ns/repo/create/0.3/payload.js +646 -0
  74. package/dist/git-ns/repo/create/0.3/payload.js.map +1 -0
  75. package/dist/git-ns/right/break-glass/0.1/payload.d.ts +685 -0
  76. package/dist/git-ns/right/break-glass/0.1/payload.d.ts.map +1 -0
  77. package/dist/git-ns/right/break-glass/0.1/payload.js +397 -0
  78. package/dist/git-ns/right/break-glass/0.1/payload.js.map +1 -0
  79. package/dist/git-ns/right/break-glass-notice/0.1/payload.d.ts +384 -0
  80. package/dist/git-ns/right/break-glass-notice/0.1/payload.d.ts.map +1 -0
  81. package/dist/git-ns/right/break-glass-notice/0.1/payload.js +216 -0
  82. package/dist/git-ns/right/break-glass-notice/0.1/payload.js.map +1 -0
  83. package/dist/git-ns/right/grant/0.3/payload.d.ts +678 -0
  84. package/dist/git-ns/right/grant/0.3/payload.d.ts.map +1 -0
  85. package/dist/git-ns/right/grant/0.3/payload.js +383 -0
  86. package/dist/git-ns/right/grant/0.3/payload.js.map +1 -0
  87. package/dist/git-ns/right/ratify/0.1/payload.d.ts +702 -0
  88. package/dist/git-ns/right/ratify/0.1/payload.d.ts.map +1 -0
  89. package/dist/git-ns/right/ratify/0.1/payload.js +404 -0
  90. package/dist/git-ns/right/ratify/0.1/payload.js.map +1 -0
  91. package/dist/git-ns/right/revoke/0.3/payload.d.ts +664 -0
  92. package/dist/git-ns/right/revoke/0.3/payload.d.ts.map +1 -0
  93. package/dist/git-ns/right/revoke/0.3/payload.js +378 -0
  94. package/dist/git-ns/right/revoke/0.3/payload.js.map +1 -0
  95. package/dist/git-ns/roles/reproject/0.1/payload.d.ts +325 -0
  96. package/dist/git-ns/roles/reproject/0.1/payload.d.ts.map +1 -0
  97. package/dist/git-ns/roles/reproject/0.1/payload.js +176 -0
  98. package/dist/git-ns/roles/reproject/0.1/payload.js.map +1 -0
  99. package/dist/git-ns/view/0.1/payload.d.ts +2 -2
  100. package/dist/git-ns/view/0.1/payload.js +2 -2
  101. package/dist/git-ns/view/0.1/payload.js.map +1 -1
  102. package/dist/git-ns/view/0.2/payload.d.ts +2 -2
  103. package/dist/git-ns/view/0.2/payload.js +2 -2
  104. package/dist/git-ns/view/0.2/payload.js.map +1 -1
  105. package/dist/git-ns/view/0.3/payload.d.ts +2 -2
  106. package/dist/git-ns/view/0.3/payload.js +2 -2
  107. package/dist/git-ns/view/0.3/payload.js.map +1 -1
  108. package/dist/git-ns/view/0.4/payload.d.ts +1696 -0
  109. package/dist/git-ns/view/0.4/payload.d.ts.map +1 -0
  110. package/dist/git-ns/view/0.4/payload.js +1012 -0
  111. package/dist/git-ns/view/0.4/payload.js.map +1 -0
  112. package/dist/index.d.ts +30 -0
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js +30 -0
  115. package/dist/index.js.map +1 -1
  116. package/dist/messaging/message/status/0.1/payload.d.ts +372 -0
  117. package/dist/messaging/message/status/0.1/payload.d.ts.map +1 -0
  118. package/dist/messaging/message/status/0.1/payload.js +214 -0
  119. package/dist/messaging/message/status/0.1/payload.js.map +1 -0
  120. package/dist/vta/_shared/0.3/did-key-roles.d.ts +16 -0
  121. package/dist/vta/_shared/0.3/did-key-roles.d.ts.map +1 -0
  122. package/dist/vta/_shared/0.3/did-key-roles.js +6 -0
  123. package/dist/vta/_shared/0.3/did-key-roles.js.map +1 -0
  124. package/dist/vta/attestation/mnemonic-export/1.0/payload.d.ts +326 -0
  125. package/dist/vta/attestation/mnemonic-export/1.0/payload.d.ts.map +1 -0
  126. package/dist/vta/attestation/mnemonic-export/1.0/payload.js +175 -0
  127. package/dist/vta/attestation/mnemonic-export/1.0/payload.js.map +1 -0
  128. package/dist/vta/webvh/dids/keys/add/1.0/payload.d.ts +1914 -0
  129. package/dist/vta/webvh/dids/keys/add/1.0/payload.d.ts.map +1 -0
  130. package/dist/vta/webvh/dids/keys/add/1.0/payload.js +1128 -0
  131. package/dist/vta/webvh/dids/keys/add/1.0/payload.js.map +1 -0
  132. package/dist/vta/webvh/dids/keys/list/1.0/payload.d.ts +1603 -0
  133. package/dist/vta/webvh/dids/keys/list/1.0/payload.d.ts.map +1 -0
  134. package/dist/vta/webvh/dids/keys/list/1.0/payload.js +942 -0
  135. package/dist/vta/webvh/dids/keys/list/1.0/payload.js.map +1 -0
  136. package/dist/vta/webvh/dids/keys/retire/1.0/payload.d.ts +1914 -0
  137. package/dist/vta/webvh/dids/keys/retire/1.0/payload.d.ts.map +1 -0
  138. package/dist/vta/webvh/dids/keys/retire/1.0/payload.js +1123 -0
  139. package/dist/vta/webvh/dids/keys/retire/1.0/payload.js.map +1 -0
  140. package/dist/vta/webvh/dids/keys/revoke/1.0/payload.d.ts +2021 -0
  141. package/dist/vta/webvh/dids/keys/revoke/1.0/payload.d.ts.map +1 -0
  142. package/dist/vta/webvh/dids/keys/revoke/1.0/payload.js +1168 -0
  143. package/dist/vta/webvh/dids/keys/revoke/1.0/payload.js.map +1 -0
  144. package/dist/vta/webvh/dids/rotate-keys/2.0/payload.d.ts +1992 -0
  145. package/dist/vta/webvh/dids/rotate-keys/2.0/payload.d.ts.map +1 -0
  146. package/dist/vta/webvh/dids/rotate-keys/2.0/payload.js +1151 -0
  147. package/dist/vta/webvh/dids/rotate-keys/2.0/payload.js.map +1 -0
  148. package/dist/vta/webvh/dids/update/2.0/payload.d.ts +1062 -0
  149. package/dist/vta/webvh/dids/update/2.0/payload.d.ts.map +1 -0
  150. package/dist/vta/webvh/dids/update/2.0/payload.js +616 -0
  151. package/dist/vta/webvh/dids/update/2.0/payload.js.map +1 -0
  152. package/dist/vtc/credentials/reissue/0.1/payload.d.ts +502 -0
  153. package/dist/vtc/credentials/reissue/0.1/payload.d.ts.map +1 -0
  154. package/dist/vtc/credentials/reissue/0.1/payload.js +282 -0
  155. package/dist/vtc/credentials/reissue/0.1/payload.js.map +1 -0
  156. package/dist/vtc/members/personhood/challenge/0.1/payload.d.ts +2 -2
  157. package/dist/vtc/members/personhood/challenge/0.1/payload.js +2 -2
  158. package/dist/vtc/members/personhood/challenge/0.1/payload.js.map +1 -1
  159. package/dist/vtc/vetting/vetters/profile/0.1/payload.d.ts +2 -2
  160. package/dist/vtc/vetting/vetters/profile/0.1/payload.js +2 -2
  161. package/dist/vtc/vetting/vetters/profile/0.1/payload.js.map +1 -1
  162. package/dist/vtc/vetting/vetters/resend/0.1/payload.d.ts +2 -2
  163. package/dist/vtc/vetting/vetters/resend/0.1/payload.js +2 -2
  164. package/dist/vtc/vetting/vetters/resend/0.1/payload.js.map +1 -1
  165. package/package.json +1 -1
  166. package/src/_shared/components.ts +313 -2
  167. package/src/auth/passkey/enroll/invite/0.2/payload.ts +325 -0
  168. package/src/auth/passkey/enroll/redeem/finish/0.1/payload.ts +499 -0
  169. package/src/auth/passkey/enroll/redeem/start/0.1/payload.ts +700 -0
  170. package/src/auth/passkey/revoke/finish/0.2/payload.ts +379 -0
  171. package/src/auth/passkey/revoke/start/0.2/payload.ts +349 -0
  172. package/src/auth/step-up/approve-response/0.5/payload.ts +593 -0
  173. package/src/device/list/0.1/payload.ts +4 -2
  174. package/src/device/list/0.2/payload.ts +4 -2
  175. package/src/device/register/0.1/payload.ts +4 -2
  176. package/src/device/register/0.2/payload.ts +4 -2
  177. package/src/git-ns/_shared/0.4/git-ns.ts +17 -0
  178. package/src/git-ns/account/link-status/0.1/payload.ts +2 -2
  179. package/src/git-ns/account/unlink/0.1/payload.ts +274 -0
  180. package/src/git-ns/bridge/event/0.3/payload.ts +1132 -0
  181. package/src/git-ns/bridge/job/0.4/payload.ts +691 -0
  182. package/src/git-ns/drift/resolve/0.3/payload.ts +707 -0
  183. package/src/git-ns/namespace/reseat/0.3/payload.ts +342 -0
  184. package/src/git-ns/repo/create/0.3/payload.ts +706 -0
  185. package/src/git-ns/right/break-glass/0.1/payload.ts +443 -0
  186. package/src/git-ns/right/break-glass-notice/0.1/payload.ts +258 -0
  187. package/src/git-ns/right/grant/0.3/payload.ts +434 -0
  188. package/src/git-ns/right/ratify/0.1/payload.ts +455 -0
  189. package/src/git-ns/right/revoke/0.3/payload.ts +425 -0
  190. package/src/git-ns/roles/reproject/0.1/payload.ts +220 -0
  191. package/src/git-ns/view/0.1/payload.ts +2 -2
  192. package/src/git-ns/view/0.2/payload.ts +2 -2
  193. package/src/git-ns/view/0.3/payload.ts +2 -2
  194. package/src/git-ns/view/0.4/payload.ts +1075 -0
  195. package/src/index.ts +30 -0
  196. package/src/messaging/message/status/0.1/payload.ts +270 -0
  197. package/src/vta/_shared/0.3/did-key-roles.ts +17 -0
  198. package/src/vta/attestation/mnemonic-export/1.0/payload.ts +232 -0
  199. package/src/vta/webvh/dids/keys/add/1.0/payload.ts +1217 -0
  200. package/src/vta/webvh/dids/keys/list/1.0/payload.ts +1004 -0
  201. package/src/vta/webvh/dids/keys/retire/1.0/payload.ts +1212 -0
  202. package/src/vta/webvh/dids/keys/revoke/1.0/payload.ts +1276 -0
  203. package/src/vta/webvh/dids/rotate-keys/2.0/payload.ts +1262 -0
  204. package/src/vta/webvh/dids/update/2.0/payload.ts +713 -0
  205. package/src/vtc/credentials/reissue/0.1/payload.ts +357 -0
  206. package/src/vtc/members/personhood/challenge/0.1/payload.ts +2 -2
  207. package/src/vtc/vetting/vetters/profile/0.1/payload.ts +2 -2
  208. package/src/vtc/vetting/vetters/resend/0.1/payload.ts +2 -2
package/CHANGELOG.md CHANGED
@@ -11,6 +11,239 @@ The package versions over **its own API** — what a consumer compiles against
11
11
  not over `SPEC.md`. Below 1.0 a breaking change bumps the leading non-zero
12
12
  component.
13
13
 
14
+ ## 0.21.0 — 2026-09-26
15
+
16
+
17
+ ### Added
18
+
19
+ - **git-ns**: Separation of duties for elevated rights, with an audited break-glass (#641)
20
+
21
+ * feat(git-ns): separation of duties for elevated rights, with an audited break-glass
22
+
23
+ An elevated git right (git.ns.admin, git.repo.create, git.repo.own) is now
24
+ always granted by someone other than its recipient, and the one way to give
25
+ oneself one is an explicit, justified, highly visible break-glass that another
26
+ administrator ratifies or revokes.
27
+
28
+ - git-ns/right/grant 0.3: fixed rule 7, separation of duties, refused with
29
+ git-ns:selfGrantNotAllowed. It binds every task that records a right on the
30
+ actor's own authority (drift/resolve adopt, repo/adopt, namespace/reseat);
31
+ bind and repo/create are not self-grants. Rules 3 and 4 count only records
32
+ with no expiry that are not unratified break-glass.
33
+ - git-ns/right/break-glass 0.1 (new): self-grant of an elevated right the
34
+ actor may already grant, or git.ns.admin on a headless namespace for a
35
+ community administrator. Mandatory justification, destructive, immediate,
36
+ no expiry, highest-severity audit, notice to every administrator, visible
37
+ until ratified or revoked. Policy may disable, delay or tighten it, never
38
+ quieten it.
39
+ - git-ns/right/ratify 0.1 (new): another administrator clears the flag,
40
+ bound to the breakGlass.at they read.
41
+ - git-ns/right/break-glass-notice 0.1 (new): the VTC's signed push to every
42
+ community administrator and namespace admin, for break-glass, ratified and
43
+ revoked.
44
+ - git-ns/right/revoke 0.3: any community administrator may revoke an
45
+ unratified break-glass record; policy cannot refuse that.
46
+ - git-ns/view 0.4: unratified break-glass records go to every administrator
47
+ they concern, whatever else the caller may see.
48
+ - git-ns/_shared 0.4: BreakGlass, RightRecord.breakGlass, ElevatedRight.
49
+
50
+ Rust, TypeScript, Go and Dart bindings regenerated.
51
+
52
+ - **git-ns**: Drift/resolve 0.3 binds an adoption to the member it names (#640)
53
+
54
+ * feat(git-ns): drift/resolve 0.3 binds an adoption to the member it names
55
+
56
+ A drift/resolve 0.2 adoption did not name who receives the right. The VTC
57
+ resolved the item's forge account to whoever had linked it when the task
58
+ ran, so an account unlinked and linked again, to someone else, between the
59
+ resolver reading the item and signing granted a right, published to the
60
+ Trust Registry, to a member the resolver never saw. The signed document
61
+ said nothing otherwise: observed bounded which role an adoption records,
62
+ nothing bounded to whom.
63
+
64
+ drift/resolve 0.3 adds `subject`, the DID of the member the resolver read
65
+ as linked to the account. It is required for adopt and absent for revert,
66
+ refused as malformedRequest otherwise (as a missing `observed` is, and
67
+ likewise stated in prose rather than a schema conditional). The VTC adopts
68
+ only while the account is still linked to exactly that member, re-checked
69
+ under the same exclusion as the write that records the right, and refuses
70
+ otherwise with the new git-ns/drift/resolve:subjectChanged.
71
+
72
+ Versioning. A 0.2 document is a 0.3 document with no `subject`: still a
73
+ valid revert, now a malformed adopt. Required-for-one-action is not
74
+ backwards-compatible, so this is a MINOR increment under the draft
75
+ allowance of SPEC 5.2. A VTC serving older versions SHOULD NOT accept a
76
+ 0.1 or 0.2 adopt, since it cannot know whom that resolver meant, and SHOULD
77
+ refuse one naming 0.3.
78
+
79
+ git-ns/view still returns a member only their own account links, so a
80
+ client that has only git-ns/view cannot adopt another member's role; the
81
+ spec says so. Invalid examples cover a DID URL, shell metacharacters and a
82
+ list as `subject`.
83
+
84
+ Bindings regenerated for Rust, TypeScript, Go and Dart.
85
+
86
+ - **git-ns**: Re-project roles on demand, and the bridge reports its role map (#639)
87
+
88
+ * feat(git-ns): re-project roles on demand, and the bridge reports its role map
89
+
90
+ A bridge's role map (which forge role own, maintain and commit.sign get)
91
+ is the community's to configure per bridge, forge, namespace and
92
+ repository, but nothing told the VTC what map was in force, and a
93
+ change reached a repository only at its next unrelated projection.
94
+
95
+ - git-ns/bridge/event 0.3: a new event type, roleMapReported. The bridge
96
+ reports, per namespace, its role map as the forge applies it (rounded
97
+ onto the forge's ladder: `none` < `read` < `triage` < `write` <
98
+ `maintain` < `admin`), each repository whose map differs (`repos`), and
99
+ each repository whose roles it last projected under a different map
100
+ (`stale`). Sent at start-up, on a map change and after bindCompleted.
101
+ The map has no member for git.ns.admin: a namespace admin projects to
102
+ no forge role whatever the configuration. The VTC refuses an unordered
103
+ map, confines `repos` and `stale` to the namespace, uses the map
104
+ wherever it shows or derives a forge role, and SHOULD re-project each
105
+ stale repository. Everything else is restated unchanged from 0.2; the
106
+ schema pins _shared/0.3, wire-identical for every event shape.
107
+
108
+ - git-ns/roles/reproject 0.1 (new): a community administrator, or a
109
+ namespace admin by explicit record, has the VTC send the complete
110
+ desiredRoles of one repository, or of every active or orphaned
111
+ repository in a namespace, again. No right changes and nothing is
112
+ published; the audit record says who asked and why. Refused in manual
113
+ mode (manualMode) and while the bridge has no access (noForgeAccess).
114
+
115
+ - git-ns/drift/resolve 0.2 (draft, in place): the projected right of a
116
+ role is the lowest right whose role in the bridge's reported map is
117
+ that role; the default map without a report.
118
+
119
+ Bindings regenerated for Rust, TypeScript, Go and Dart.
120
+
121
+ - **vta/webvh/dids/keys**: Named key roles and per-role rotation for a VTA's DIDs (#638)
122
+
123
+ * feat(vta/webvh/dids/keys): named key roles and per-role rotation for a VTA's DIDs
124
+
125
+ Adds the Trust Tasks every client uses to manage the key roles of the
126
+ did:webvh identities a VTA holds keys for (its own, and those of the
127
+ VTCs and VTNs provisioned on it), aligned with the VTI key-roles draft
128
+ (dtgwg-vti-spec#42): attestation, operational, messaging and update.
129
+
130
+ - **git-ns/account/unlink**: A member unlinks their own forge account (#636)
131
+
132
+ * feat(git-ns/account/unlink): a member unlinks their own forge account
133
+
134
+ git-ns/account/link said a binding lasts "until the member unlinks or
135
+ leaves", but no task unlinked: the only way to drop an account was to
136
+ link another on the same forge, or to leave the community.
137
+
138
+ - **git-ns**: Bridge/job 0.4 and namespace/reseat 0.3, a namespace admin gets no forge role (#635)
139
+
140
+ * feat(git-ns): bridge/job 0.4 and namespace/reseat 0.3 — a namespace admin gets no forge role
141
+
142
+ A namespace admin exercises git.ns.admin through the VTC and its bridge,
143
+ never through a forge role: the bridge does not make them an owner of the
144
+ organisation and gives them no role on any repository for it.
145
+
146
+ git-ns/bridge/job 0.4:
147
+ - desiredRoles carries, per person, the highest right recorded in their
148
+ own name on the repository (own, maintain or commit.sign there, or
149
+ commit.sign on the namespace), never one held only because git.ns.admin
150
+ implies it. A namespace admin with none is listed at git.ns.admin, which
151
+ every adapter maps to no role, so the bridge takes off a role it manages
152
+ that they still hold. An admin who is also a recorded owner is listed as
153
+ the owner.
154
+ - Each forge account appears in desiredRoles at most once.
155
+ - repo is required for projectRoles: the namespace-level job, which only
156
+ ever projected git.ns.admin as organisation owners, no longer exists.
157
+ - removeAccounts may name an account listed at git.ns.admin.
158
+ - A VTC must not send 0.4 to a bridge that has not shown it takes 0.4, and
159
+ should read an unsupportedType or unsupportedVersion refusal as the
160
+ bridge taking only earlier versions.
161
+
162
+ git-ns/namespace/reseat 0.3: step 8 no longer queues a namespace-level
163
+ forge projection. Wire-identical to 0.2.
164
+
165
+ Earlier versions are unchanged. Both are draft, so the breaking changes
166
+ ship as MINOR increments under the draft allowance of SPEC 5.2.
167
+
168
+
169
+
170
+ ### Security
171
+
172
+ - **didcomm**: A consumer may require a proof over DIDComm (#642)
173
+
174
+ The DIDComm binding lets a producer omit `proof` because the envelope
175
+ authenticates the sender. A consumer that authorizes on the sender's identity
176
+ now MAY decline that allowance and require an in-band proof on every document
177
+ it accepts over the binding, rejecting a document without one as
178
+ `proofRequired` and one whose proof does not identify the transport sender as
179
+ `identityMismatch`. A producer SHOULD include a proof on every document it
180
+ sends over DIDComm so it is accepted either way.
181
+
182
+ The tasks whose consumer authorizes or answers on the caller's identity alone
183
+ now declare `proof` REQUIRED, so the identity rests on the document on every
184
+ transport:
185
+
186
+ - vtc/vetting/vetters/profile/0.1
187
+ - vtc/vetting/vetters/resend/0.1
188
+ - vtc/members/personhood/challenge/0.1
189
+ - git-ns/view/0.1, 0.2 and 0.3
190
+ - git-ns/account/link-status/0.1
191
+
192
+ All are drafts, edited in place. Bindings regenerated for Rust, TS, Go and
193
+ Dart.
194
+
195
+ - **proof**: Check a proof's verificationMethod against its proofPurpose (#637)
196
+
197
+ * security(proof)!: check a proof's verificationMethod against its proofPurpose
198
+
199
+ The stock Verifier accepted a proof signed by any key listed under the
200
+ issuer's authentication or assertionMethod, whatever proofPurpose the proof
201
+ declared. It did not check that the verification method's controller was the
202
+ issuer. W3C Data Integrity requires both, through Controlled Identifiers
203
+ v1.0 §3.3.
204
+
205
+ - New ProofPurpose type (assertionMethod, authentication,
206
+ capabilityInvocation, capabilityDelegation). Parsing refuses keyAgreement
207
+ and unknown values.
208
+ - New ProofPurposeResolver trait resolves a verificationMethod for one
209
+ purpose. CachedDidResolver implements it. It requires the resolved
210
+ document's id and the method's controller to be the DID that names the
211
+ method. It requires the method to be listed under the relationship the
212
+ purpose names, by absolute DID URL, by a fragment relative to the
213
+ document id, or embedded. DidKeyResolver implements it with did:key's
214
+ implicit relationships: the key named `did:key:<id>#<id>` signs for all
215
+ four purposes, and an X25519 did:key signs for none.
216
+ - Verifier resolves through a ProofPurposeResolver, so every proof is
217
+ checked against its own purpose.
218
+ - New PurposeBound wraps a ProofPurposeResolver as an upstream
219
+ VerificationMethodResolver bound to one proof's purpose. It is for
220
+ callers of DataIntegrityProof::verify.
221
+ - sign_trust_task and ProofExt::sign default to proofPurpose authentication.
222
+ They refuse a purpose that names no signing relationship.
223
+ - Resolver errors name the rule that failed. They carry no DID, document or
224
+ key material.
225
+
226
+
227
+
228
+ ### Specifications
229
+
230
+ - **device**: Register the keyExport capability (#643)
231
+
232
+ keys/export-secret/0.1 authorizes against "standing over the key's
233
+ scope" and leaves the grant's shape to the implementation. Where it is a
234
+ device capability there should be a registered value, as there is for
235
+ roomPresent and roomOpen, so implementations do not each carry a private
236
+ one. The VTA already gates export on it.
237
+
238
+ keyExport (key-export in the 0.1 casing) is deliberately separate from
239
+ sign: a producer that may ask the custodian to use a key loses that the
240
+ moment its entitlement changes, while a producer that took the key keeps
241
+ it after its authority is withdrawn. export-secret now names the value
242
+ and says a sign grant is not a keyExport grant. The value is additive,
243
+ so a consumer that does not recognise it ignores it.
244
+
245
+ Bindings regenerated (Rust, TS, Go, Dart); no version bumps.
246
+
14
247
  ## 0.20.8 — 2026-09-24
15
248
 
16
249
 
@@ -46,11 +46,11 @@ export type CalendarDate = string;
46
46
  /**
47
47
  * Fine-grained capability flag scoped to the device's allowed contexts. See SPEC.md for the full semantics of each. Capability values are additive: a consumer MUST ignore a value it does not recognise rather than reject the binding, and MUST NOT treat an unrecognised value as conferring anything.
48
48
  */
49
- export type Capability_DeviceV0_1 = "vault-read" | "vault-write" | "proxy-login" | "fill-release" | "policy-admin" | "device-admin" | "sign" | "key-mint" | "sign-trust-task" | "credential-write" | "memory-read" | "memory-write" | "room-present" | "room-open";
49
+ export type Capability_DeviceV0_1 = "vault-read" | "vault-write" | "proxy-login" | "fill-release" | "policy-admin" | "device-admin" | "sign" | "key-mint" | "sign-trust-task" | "credential-write" | "memory-read" | "memory-write" | "room-present" | "room-open" | "key-export";
50
50
  /**
51
51
  * Fine-grained capability flag scoped to the device's allowed contexts. See SPEC.md for the full semantics of each. Capability values are additive: a consumer MUST ignore a value it does not recognise rather than reject the binding, and MUST NOT treat an unrecognised value as conferring anything.
52
52
  */
53
- export type Capability_DeviceV0_2 = "vaultRead" | "vaultWrite" | "proxyLogin" | "fillRelease" | "policyAdmin" | "deviceAdmin" | "sign" | "keyMint" | "signTrustTask" | "credentialWrite" | "memoryRead" | "memoryWrite" | "roomPresent" | "roomOpen";
53
+ export type Capability_DeviceV0_2 = "vaultRead" | "vaultWrite" | "proxyLogin" | "fillRelease" | "policyAdmin" | "deviceAdmin" | "sign" | "keyMint" | "signTrustTask" | "credentialWrite" | "memoryRead" | "memoryWrite" | "roomPresent" | "roomOpen" | "keyExport";
54
54
  /**
55
55
  * Number of chunks in the bundle, equal to ceil(expectedSizeBytes / chunkSize). Bounded at 4096 so that the manifest itself — one digest per chunk — fits in the single document that carries it under the same message-size reasoning as a chunk.
56
56
  */
@@ -128,6 +128,10 @@ export type DeviceAttestation_DeviceV0_1 = WebAuthnAttestation_DeviceV0_1 | Appl
128
128
  * Producer-supplied attestation at registration time, verifiable by the maintainer against the platform's attestation infrastructure. Tagged union over the discriminator `kind`.
129
129
  */
130
130
  export type DeviceAttestation_DeviceV0_2 = WebAuthnAttestation_DeviceV0_2 | AppleAppAttest_DeviceV0_2 | PlayIntegrity_DeviceV0_2 | Tpm_DeviceV0_2 | NitroEnclave_DeviceV0_2 | NoAttestation_DeviceV0_2;
131
+ /**
132
+ * A DID Core verification relationship.
133
+ */
134
+ export type DidVerificationRelationship = "authentication" | "assertionMethod" | "keyAgreement" | "capabilityInvocation" | "capabilityDelegation";
131
135
  /**
132
136
  * A DID, compared by exact string equality.
133
137
  */
@@ -154,6 +158,10 @@ export type DriftType = "roleAdded" | "roleRemoved" | "roleChanged" | "requiredC
154
158
  * Whether the subject is permitted. The ABSENCE of any grant is treated as `deny` (default-deny).
155
159
  */
156
160
  export type Effect_ConsentV0_1 = "allow" | "deny";
161
+ /**
162
+ * The three rights that carry authority over other people's rights: `git.ns.admin`, `git.repo.create` (which makes its holder the owner of every repository they create) and `git.repo.own`. Separation of duties applies to these: nobody grants one to themselves through git-ns/right/grant, or records one for themselves through any other task that grants on the actor's own authority. The explicit self-grant is git-ns/right/break-glass. `git.repo.maintain` and `git.commit.sign` are not elevated.
163
+ */
164
+ export type ElevatedRight = "git.ns.admin" | "git.repo.create" | "git.repo.own";
157
165
  /**
158
166
  * Lowercase hex SHA-256 of the whole bundle's bytes. Kept in the hex form the 1.0 descriptor published rather than moved to DigestMultibase, because it is an unchanged member of an existing descriptor and re-encoding it would break every stream producer for no gain in what it checks. For a chunked transfer it is the check over the reassembled bundle, applied after every chunk has verified individually, so that a correct set of chunks assembled in the wrong order is still caught.
159
167
  */
@@ -241,6 +249,18 @@ export type Key = string;
241
249
  * Where the private key came from. `derived` means the maintainer generated it from a seed it holds and can reproduce it from `derivationPath`; `imported` means it arrived from outside and exists only as stored material; `internal` means the maintainer generated it from a CSPRNG and it is reproducible from nothing at all. The distinction is operationally load-bearing: a `derived` key survives a seed restore, an `imported` one is lost unless it was backed up separately, and an `internal` one cannot be recovered by any means once the maintainer's storage is gone. This member is also the only way a consumer can confirm that a `keys/create` request for an `internal` key was honoured rather than silently downgraded to a derived one — see that specification's `internal` member.
242
250
  */
243
251
  export type KeyOrigin = "derived" | "imported" | "internal";
252
+ /**
253
+ * The named key role a key occupies in the DID (VTI-KEY-070 onward). `attestation` — the only keys in `assertionMethod`; sign the DID's attestation artefacts (membership and role credentials, endorsements, status lists, every other credential the node issues), through the VTA's signing service and nowhere else. Generated inside the VTA, never derived, never exportable, never in a backup. `operational` — the only keys in `authentication`; sign the node's own traffic (Trust Task requests and responses, DIDComm and TSP message signatures, invitations, notices, audit checkpoints) with proof purpose `authentication`. `messaging` — the only keys in `keyAgreement`; sign nothing. `update` — the keys that authorize appending to the DID's log (a did:webvh `updateKeys` entry) and the pre-rotation commitments that authorize the next ones; never a verification method, never in `keyRoles`. Generated inside the VTA, never derived, never exportable, never in a backup. No role permits `capabilityInvocation` or `capabilityDelegation` (VTI-KEY-075); both are reserved for a future role. The mapping is normative and is set out in CONVENTIONS.md §1. The set is an extensible registry and growing it is a MINOR change: a consumer that receives a role it does not implement MUST refuse the document rather than map the key onto a role it does know.
254
+ */
255
+ export type KeyRole = "attestation" | "operational" | "messaging" | "update";
256
+ /**
257
+ * `preview` — nothing was written; the response carries the plan. `applied` — the entry was appended (and published, unless `serverless`). `pendingApproval` — the plan is recorded and awaits further approvals; nothing is published until they arrive (CONVENTIONS.md §3.3).
258
+ */
259
+ export type KeyRoleChangeOutcome = "preview" | "applied" | "pendingApproval";
260
+ /**
261
+ * Which view of the DID's key roles the caller was given (CONVENTIONS.md §5). `public` — only what the published document and log already reveal to anyone who resolves the DID. `custody` — additionally the VTA's own custody state: pending keys, the custodian record behind each key, overlap deadlines, who initiated and approved each change, and why. The response always states which it is, so a caller never mistakes an absent member for a statement that the thing does not exist.
262
+ */
263
+ export type KeyRoleProjection = "public" | "custody";
244
264
  /**
245
265
  * Lifecycle state. Only an `active` key may be named in a signing request; a `revoked` key is retained so historic signatures remain attributable, and MUST NOT be reactivated.
246
266
  */
@@ -453,6 +473,18 @@ export type RetentionPolicy = "chained" | "fromJoin";
453
473
  * One of the five git rights. Each string is also the TRQP `action` the VTC publishes the right under in its Trust Registry, so it is carried verbatim. `git.ns.admin` and `git.repo.create` apply to a namespace resource; `git.repo.own` and `git.repo.maintain` to a repository resource; `git.commit.sign` to either.
454
474
  */
455
475
  export type Right = "git.ns.admin" | "git.repo.create" | "git.repo.own" | "git.repo.maintain" | "git.commit.sign";
476
+ /**
477
+ * Where a key is in its role's lifecycle. `pending` — planned by a preview or a change awaiting approval; not published; custody projection only. `staged` — published and bound to its role, but not yet used: a planned rotation publishes the successor and waits until the entry's cache horizon — publication plus the longer of the document's TTL and the verifier cache cap (CONVENTIONS.md §11.1) — before the VTA first uses it, so that no verifier holding a cached document sees a signature by a key it has never seen (VTI-KEY-122). Becomes `active` at the rotation's `activatesAt`. `active` — the key the VTA uses for new signatures (or, for `messaging`, advertises for new sessions). `retiring` — still published so that what it signed and sessions keyed to it keep working, but never used again: from the successor's first use the VTA MUST NOT sign with it, while a retiring `messaging` key stays usable for decryption, and senders may still encrypt to it, until it is retired (CONVENTIONS.md §11.3). `retired` — removed by planned rotation; what it signed while published remains valid, judged against the DID version current at issuance (CONVENTIONS.md §7). A retired `attestation` or `messaging` key is destroyed at retirement. `revoked` — removed from every relationship and from `keyRoles` in one entry, without overlap, because it is or may be compromised; what it signed from `compromisedSince` onward establishes nothing. `retired` and `revoked` are terminal.
478
+ */
479
+ export type RoleKeyState = "pending" | "staged" | "active" | "retiring" | "retired" | "revoked";
480
+ /**
481
+ * `planned` — a successor was staged, activated, and the predecessor retired on the operator's schedule. `compromise` — a key was revoked and, where the role would otherwise be empty, replaced in the same log entry. `addition` — a key was added to a role without anything leaving it (for example a post-quantum key alongside a classical one).
482
+ */
483
+ export type RotationKind = "planned" | "compromise" | "addition";
484
+ /**
485
+ * `pendingApproval` — awaiting the approvals the VTA's policy requires; nothing is published. `staged` — successor published, not yet used; predecessor still active. `overlapping` — successor active, predecessor `retiring`. `completed` — every predecessor retired (or, for `compromise` and `addition`, the entry is published and any overlap it began has ended). `aborted` — the successor was retired instead of the predecessor, which stayed or returned to `active`. `expired` — approvals were not gathered before the preview expired; nothing was published.
486
+ */
487
+ export type RotationState = "pendingApproval" | "staged" | "overlapping" | "completed" | "aborted" | "expired";
456
488
  /**
457
489
  * How a consent prompt reaches the approver: `wake` pushes to the approver's device for a DID-signed decision; `bridge-relay` renders it through an enrolled bridge (e.g. a numbered card in the operator's messaging app) for a bridge-attested decision.
458
490
  */
@@ -1310,6 +1342,35 @@ export interface Bootstrap {
1310
1342
  */
1311
1343
  requiredCheck: boolean;
1312
1344
  }
1345
+ /**
1346
+ * How a self-granted right came to be, and whether another administrator has since ratified it. A record whose `breakGlass` has no `ratifiedBy` is **unratified**: it is live and published like any other right, it does not count toward the last-owner or last-admin invariants, and any community administrator or namespace admin of its namespace may revoke it. Ratification (git-ns/right/ratify) sets `ratifiedBy` and `ratifiedAt`; from then on the record is an ordinary grant, and `breakGlass` stays as its history. Never published to the Trust Registry.
1347
+ */
1348
+ export interface BreakGlass {
1349
+ /**
1350
+ * Who broke the glass: always the record's `subject`, restated so the flag reads on its own.
1351
+ */
1352
+ by: Did_GitNsV0_3;
1353
+ /**
1354
+ * When the VTC recorded the break-glass.
1355
+ */
1356
+ at: string;
1357
+ /**
1358
+ * The actor's statement of why nobody else could grant this right. Shown to every community administrator, every namespace admin of the namespace and every owner of the resource; kept in the audit record; never published.
1359
+ */
1360
+ justification: string;
1361
+ /**
1362
+ * When the right takes effect, where the community's policy imposed a delay. Absent: it took effect at `at`. Until this instant the record confers nothing and is not published, and any administrator who may revoke it may do so.
1363
+ */
1364
+ effectiveAt?: string;
1365
+ /**
1366
+ * The administrator who ratified the record — never its subject. Absent while unratified.
1367
+ */
1368
+ ratifiedBy?: Did_GitNsV0_3;
1369
+ /**
1370
+ * When it was ratified. Present exactly when `ratifiedBy` is.
1371
+ */
1372
+ ratifiedAt?: string;
1373
+ }
1313
1374
  /**
1314
1375
  * The self-description of a pluggable community capability: the Trust Task families it serves, the trust-registry vocabulary it reads and writes, the roles that may operate it, the membership lifecycle hooks it consumes, and the external adapters that act on its decisions. The manifest is what governance approves, what discovery advertises, and what a management UX renders.
1315
1376
  */
@@ -1970,6 +2031,48 @@ export interface DeviceBinding_DeviceV0_2 {
1970
2031
  wipedAt?: string;
1971
2032
  ext?: Ext;
1972
2033
  }
2034
+ export interface DidDocumentChange {
2035
+ /**
2036
+ * `addKey` — a verification method is added, listed in its role's relationship and in `keyRoles`. `retireKey` — a verification method leaves its relationship, `keyRoles` and the document. `revokeKey` — a verification method leaves its relationship and `keyRoles`, and the compromise is recorded (CONVENTIONS.md §7). `rotateUpdateKey` — the log's update key moves to a committed successor. `setPreRotation` — the number of successors committed changes.
2037
+ */
2038
+ op: "addKey" | "retireKey" | "revokeKey" | "rotateUpdateKey" | "setPreRotation";
2039
+ role: KeyRole;
2040
+ verificationMethod?: string;
2041
+ keyType?: KeyType;
2042
+ publicKeyMultibase?: string;
2043
+ relationships?: DidVerificationRelationship[];
2044
+ preRotationCount?: number;
2045
+ }
2046
+ /**
2047
+ * What a change would publish, computed by the VTA by running the handler it would run to apply it, and nothing else (CONVENTIONS.md §3.1). This is what a consent surface renders and what an approval is bound to.
2048
+ */
2049
+ export interface DidDocumentPreview {
2050
+ /**
2051
+ * Opaque, unguessable identifier for this exact plan. Carried back by the apply request, and the thing every approval is bound to.
2052
+ */
2053
+ previewId: string;
2054
+ /**
2055
+ * versionId of the log entry the plan was computed against. The plan is void once the log moves past it.
2056
+ */
2057
+ baseVersionId: string;
2058
+ expiresAt: string;
2059
+ /**
2060
+ * Every change the entry would make, including the ones the caller did not ask for — in particular `rotateUpdateKey`, which accompanies every entry appended under pre-rotation.
2061
+ */
2062
+ changes: DidDocumentChange[];
2063
+ /**
2064
+ * The complete DID document the entry would publish. Public data by construction; no key material beyond public halves.
2065
+ */
2066
+ document: {};
2067
+ /**
2068
+ * Conditions a human should be shown before approving. `preRotationDisabled` — the entry leaves no committed successor, so a later update-key compromise can only end in deactivation. `singleKeyRole` — the role will hold one active key, so its next compromise empties it until replaced. `algorithmNotInAcceptedSet` — a verifier population the VTA knows of does not accept the new key's algorithm. `roleWillHaveNoClassicalKey` — every remaining key is post-quantum, which verifiers without post-quantum support cannot check. `attestationReissuanceRequired` — revoking this `attestation` key obliges the node to re-issue every attestation artefact still in force and re-sign every status list (VTI-KEY-133). `serverless` — the VTA will not publish the entry; the operator must.
2069
+ */
2070
+ warnings?: ("preRotationDisabled" | "singleKeyRole" | "algorithmNotInAcceptedSet" | "roleWillHaveNoClassicalKey" | "attestationReissuanceRequired" | "serverless")[];
2071
+ /**
2072
+ * True when appending this entry also moves the DID's update key to a committed successor. Stated as its own member, not left to be found in `changes`, because it is the consequence a reviewer most often misses.
2073
+ */
2074
+ updateKeyRotates: boolean;
2075
+ }
1973
2076
  export interface DidRecord {
1974
2077
  /**
1975
2078
  * Local path under which the DID is hosted (e.g. `alice`, `tenant/staff/alice`, `.well-known`). Compared by exact string equality (SPEC.md §4.8); producers SHOULD emit canonical form.
@@ -2783,6 +2886,27 @@ export interface KeyRecord {
2783
2886
  updatedAt?: string;
2784
2887
  ext?: Ext;
2785
2888
  }
2889
+ /**
2890
+ * Approval progress of a change the VTA's policy gates on more than one approval (CONVENTIONS.md §3.3).
2891
+ */
2892
+ export interface KeyRoleApprovalState {
2893
+ /**
2894
+ * Distinct approvals the VTA's policy requires.
2895
+ */
2896
+ required: number;
2897
+ /**
2898
+ * Distinct approvals recorded so far, including the initiator's own.
2899
+ */
2900
+ received: number;
2901
+ /**
2902
+ * VIDs whose approvals were recorded. Custody projection only; omitted from a response to anyone who is not themselves an eligible approver of this change.
2903
+ */
2904
+ approvers?: string[];
2905
+ /**
2906
+ * When the preview, and every approval bound to it, stops being usable.
2907
+ */
2908
+ expiresAt: string;
2909
+ }
2786
2910
  /**
2787
2911
  * The mediator's per-account access-control capability set, expressed as named booleans (the transport-agnostic form of the mediator's internal capability flags). On a set request, members omitted are left unchanged; a get/response carries the full realized set.
2788
2912
  */
@@ -3938,6 +4062,129 @@ export interface RightRecord_GitNsV0_3 {
3938
4062
  */
3939
4063
  reason?: string;
3940
4064
  }
4065
+ /**
4066
+ * One recorded right. Implied rights (§4.2 of the rights model: `own` implies `maintain` implies `commit.sign` on the same resource; `ns.admin` implies `repo.create` and `own` across its namespace) are not records and never appear as RightRecords. A record carrying `breakGlass` was given by its subject to themselves through git-ns/right/break-glass; it is a real right, published like any other, and is shown with that flag on every surface that shows the record.
4067
+ */
4068
+ export interface RightRecord_GitNsV0_4 {
4069
+ /**
4070
+ * Who holds the right. For `git.commit.sign` this is the DID whose commit signatures the CI check accepts.
4071
+ */
4072
+ subject: Did_GitNsV0_3;
4073
+ right: Right;
4074
+ resource: Resource;
4075
+ /**
4076
+ * The actor whose task caused the right: the granter, the creator of a repository (for its first `own`), the adopting admin, the transferring owner, or the binding admin (for the first `git.ns.admin`). The VTC's own DID for a right it derives from its configuration.
4077
+ */
4078
+ grantedBy: Did_GitNsV0_3;
4079
+ grantedAt: string;
4080
+ /**
4081
+ * When the right lapses. Absent: no expiry.
4082
+ */
4083
+ expiresAt?: string;
4084
+ /**
4085
+ * The granter's free-text reason. Disclosed only to holders of `git.repo.own` on the resource and of `git.ns.admin` over it.
4086
+ */
4087
+ reason?: string;
4088
+ /**
4089
+ * Present exactly when the subject gave themselves this right through git-ns/right/break-glass. Absent for every other record.
4090
+ */
4091
+ breakGlass?: BreakGlass;
4092
+ }
4093
+ /**
4094
+ * One key in one role. A key is in exactly one role for its whole life; a change of role is a retirement from one and an addition to another, under a new verification-method identifier.
4095
+ */
4096
+ export interface RoleKey {
4097
+ /**
4098
+ * The full verification-method identifier (`did#fragment`) the document publishes the key under, and lists in `keyRoles`. Absent only for `update` keys, which are published as log parameters and never as verification methods (VTI-KEY-093). A VTA minting a new method SHOULD derive its fragment from the key (VTI-KEY-150).
4099
+ */
4100
+ verificationMethod?: string;
4101
+ role: KeyRole;
4102
+ /**
4103
+ * The relationships the key is (or, while `pending`, will be) listed in. Always exactly its role's single relationship (CONVENTIONS.md §1) — carried so a caller can check it against the document rather than trusting it. Empty for `update`, `retired` and `revoked` keys.
4104
+ */
4105
+ relationships?: DidVerificationRelationship[];
4106
+ keyType: KeyType;
4107
+ /**
4108
+ * The public half, multibase-encoded, exactly as published.
4109
+ */
4110
+ publicKeyMultibase: string;
4111
+ state: RoleKeyState;
4112
+ /**
4113
+ * versionId of the log entry that first published the key. Absent while `pending`.
4114
+ */
4115
+ publishedInVersionId?: string;
4116
+ /**
4117
+ * versionId of the log entry that retired or revoked the key.
4118
+ */
4119
+ removedInVersionId?: string;
4120
+ /**
4121
+ * For a `retiring` key: the end of its overlap window. Custody projection only.
4122
+ */
4123
+ retireAfter?: string;
4124
+ /**
4125
+ * For a `revoked` key: the compromise time (VTI-KEY-121) — the earliest instant from which the key is treated as compromised. Where the operator cannot establish it, the time the key was first published. Published, because it is what a verifier needs.
4126
+ */
4127
+ compromisedSince?: string;
4128
+ /**
4129
+ * The rotation this key was introduced or retired by, when it was.
4130
+ */
4131
+ rotationId?: string;
4132
+ /**
4133
+ * Operator-facing label. Custody projection only.
4134
+ */
4135
+ label?: string;
4136
+ custody?: RoleKeyCustody;
4137
+ ext?: Ext;
4138
+ /**
4139
+ * For a `staged` key: when the VTA will begin using it — no earlier than the publishing entry's cache horizon (CONVENTIONS.md §11.1).
4140
+ */
4141
+ activatesAt?: string;
4142
+ }
4143
+ /**
4144
+ * How the VTA holds a key. Present only in the custody projection. Carries no key material, and a conforming VTA MUST NOT place any in `ext`.
4145
+ */
4146
+ export interface RoleKeyCustody {
4147
+ /**
4148
+ * The custodian record identifier (`keys/*`'s `keyId`) behind this key.
4149
+ */
4150
+ keyId: string;
4151
+ origin?: KeyOrigin;
4152
+ /**
4153
+ * Whether the custodian would release the private half through `keys/export-secret`. Always `false` for `attestation` and `update` keys (CONVENTIONS.md §4). Stated explicitly — never absent — because this is the member an operator reads to confirm a role key cannot leave the VTA, and `keys/*`'s absent-means-exportable reading is the wrong default to leave them to infer.
4154
+ */
4155
+ exportable: boolean;
4156
+ /**
4157
+ * True when no authority can make the key exportable — the role forbids it, or the material exists only inside a module that cannot release it. `true` implies `exportable: false`.
4158
+ */
4159
+ neverExportable: boolean;
4160
+ /**
4161
+ * True when the private half is held by a hardware or enclave module that performs the operation without releasing it. Absent means the VTA does not say, not that it is false.
4162
+ */
4163
+ hardwareBacked?: boolean;
4164
+ /**
4165
+ * Whether the key, or material it can be re-derived from, is included in the VTA's backups or any state transfer. Always `false` for `attestation` and `update` keys (VTI-KEY-112): they are generated, not derived, so there is no seed that recovers them, and their loss is recovered by rotation, never by restore.
4166
+ */
4167
+ inBackups: boolean;
4168
+ /**
4169
+ * True once the private half has been destroyed — a retired `attestation` key (VTI-KEY-125). The record survives so the key's past signatures stay attributable.
4170
+ */
4171
+ destroyed?: boolean;
4172
+ }
4173
+ export interface RoleSummary {
4174
+ role: KeyRole;
4175
+ /**
4176
+ * The relationship this role owns (CONVENTIONS.md §1). Empty for `update`.
4177
+ */
4178
+ relationships: DidVerificationRelationship[];
4179
+ /**
4180
+ * The role's keys, in the order the document publishes them. Terminal-state keys are included only when the request asked for them.
4181
+ */
4182
+ keys: RoleKey[];
4183
+ /**
4184
+ * `update` only: successors the latest entry commits to. `0` means a compromise of the current update key cannot be recovered from by rotation, and the DID would have to be deactivated (VTI-KEY-124).
4185
+ */
4186
+ preRotationCommitments?: number;
4187
+ }
3941
4188
  /**
3942
4189
  * The outcome of a rollback. Distinct from ServiceMutationResult because a rollback can legitimately publish nothing: if the previous state already equals the current one there is no change to write, and `kind: "noOp"` says so with `logEntryVersionId` absent. Treating that as a failure would be wrong — the requested state holds — and treating it as an ordinary success would report a log entry that does not exist.
3943
4190
  */
@@ -3972,6 +4219,56 @@ export interface RollbackResult {
3972
4219
  serverless?: boolean;
3973
4220
  ext?: Ext;
3974
4221
  }
4222
+ /**
4223
+ * One change to a role's key set, from preview to completion. The rotation history of a DID is the list of these; the log is the authority for what was published, and this record adds what the log cannot say — which change was which, and (custody projection only) who asked, who approved, and why.
4224
+ */
4225
+ export interface RotationRecord {
4226
+ rotationId: string;
4227
+ role: KeyRole;
4228
+ kind: RotationKind;
4229
+ state: RotationState;
4230
+ /**
4231
+ * Verification-method identifiers (or, for `update`, public keys) leaving the role.
4232
+ */
4233
+ predecessors?: string[];
4234
+ /**
4235
+ * Verification-method identifiers (or, for `update`, public keys) entering the role.
4236
+ */
4237
+ successors?: string[];
4238
+ startedInVersionId?: string;
4239
+ endedInVersionId?: string;
4240
+ startedAt?: string;
4241
+ /**
4242
+ * Custody projection only. End of the overlap window.
4243
+ */
4244
+ overlapUntil?: string;
4245
+ /**
4246
+ * Custody projection only. Whether the VTA retires the predecessor itself at `overlapUntil`.
4247
+ */
4248
+ autoRetire?: boolean;
4249
+ endedAt?: string;
4250
+ /**
4251
+ * Custody projection only. VID of the administrator whose signed request started the change.
4252
+ */
4253
+ initiatedBy?: string;
4254
+ /**
4255
+ * Custody projection only.
4256
+ */
4257
+ approvals?: KeyRoleApprovalState;
4258
+ /**
4259
+ * Custody projection only. The operator's stated reason. Never published.
4260
+ */
4261
+ reason?: string;
4262
+ ext?: Ext;
4263
+ /**
4264
+ * When the successor becomes `active` and the predecessor `retiring`; never before `cacheHorizonAt`.
4265
+ */
4266
+ activatesAt?: string;
4267
+ /**
4268
+ * Planned rotations: the publishing entry's cache horizon — publication plus the longer of the document's TTL and the verifier cache cap (CONVENTIONS.md §11.1). The switch, and any retirement of the predecessor, happen no earlier. Public: it follows from the log and the published cap.
4269
+ */
4270
+ cacheHorizonAt?: string;
4271
+ }
3975
4272
  export interface Builtin_VtaV0_1 {
3976
4273
  type: "builtin";
3977
4274
  }