@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.
- package/CHANGELOG.md +233 -0
- package/dist/_shared/components.d.ts +299 -2
- package/dist/_shared/components.d.ts.map +1 -1
- package/dist/auth/passkey/enroll/invite/0.2/payload.d.ts +456 -0
- package/dist/auth/passkey/enroll/invite/0.2/payload.d.ts.map +1 -0
- package/dist/auth/passkey/enroll/invite/0.2/payload.js +248 -0
- package/dist/auth/passkey/enroll/invite/0.2/payload.js.map +1 -0
- package/dist/auth/passkey/enroll/redeem/finish/0.1/payload.d.ts +728 -0
- package/dist/auth/passkey/enroll/redeem/finish/0.1/payload.d.ts.map +1 -0
- package/dist/auth/passkey/enroll/redeem/finish/0.1/payload.js +430 -0
- package/dist/auth/passkey/enroll/redeem/finish/0.1/payload.js.map +1 -0
- package/dist/auth/passkey/enroll/redeem/start/0.1/payload.d.ts +1043 -0
- package/dist/auth/passkey/enroll/redeem/start/0.1/payload.d.ts.map +1 -0
- package/dist/auth/passkey/enroll/redeem/start/0.1/payload.js +628 -0
- package/dist/auth/passkey/enroll/redeem/start/0.1/payload.js.map +1 -0
- package/dist/auth/passkey/revoke/finish/0.2/payload.d.ts +533 -0
- package/dist/auth/passkey/revoke/finish/0.2/payload.d.ts.map +1 -0
- package/dist/auth/passkey/revoke/finish/0.2/payload.js +315 -0
- package/dist/auth/passkey/revoke/finish/0.2/payload.js.map +1 -0
- package/dist/auth/passkey/revoke/start/0.2/payload.d.ts +511 -0
- package/dist/auth/passkey/revoke/start/0.2/payload.d.ts.map +1 -0
- package/dist/auth/passkey/revoke/start/0.2/payload.js +297 -0
- package/dist/auth/passkey/revoke/start/0.2/payload.js.map +1 -0
- package/dist/auth/step-up/approve-response/0.5/payload.d.ts +887 -0
- package/dist/auth/step-up/approve-response/0.5/payload.d.ts.map +1 -0
- package/dist/auth/step-up/approve-response/0.5/payload.js +504 -0
- package/dist/auth/step-up/approve-response/0.5/payload.js.map +1 -0
- package/dist/device/list/0.1/payload.d.ts +4 -4
- package/dist/device/list/0.1/payload.d.ts.map +1 -1
- package/dist/device/list/0.1/payload.js +4 -2
- package/dist/device/list/0.1/payload.js.map +1 -1
- package/dist/device/list/0.2/payload.d.ts +4 -4
- package/dist/device/list/0.2/payload.d.ts.map +1 -1
- package/dist/device/list/0.2/payload.js +4 -2
- package/dist/device/list/0.2/payload.js.map +1 -1
- package/dist/device/register/0.1/payload.d.ts +4 -4
- package/dist/device/register/0.1/payload.d.ts.map +1 -1
- package/dist/device/register/0.1/payload.js +4 -2
- package/dist/device/register/0.1/payload.js.map +1 -1
- package/dist/device/register/0.2/payload.d.ts +4 -4
- package/dist/device/register/0.2/payload.d.ts.map +1 -1
- package/dist/device/register/0.2/payload.js +4 -2
- package/dist/device/register/0.2/payload.js.map +1 -1
- package/dist/git-ns/_shared/0.4/git-ns.d.ts +16 -0
- package/dist/git-ns/_shared/0.4/git-ns.d.ts.map +1 -0
- package/dist/git-ns/_shared/0.4/git-ns.js +6 -0
- package/dist/git-ns/_shared/0.4/git-ns.js.map +1 -0
- package/dist/git-ns/account/link-status/0.1/payload.d.ts +2 -2
- package/dist/git-ns/account/link-status/0.1/payload.js +2 -2
- package/dist/git-ns/account/link-status/0.1/payload.js.map +1 -1
- package/dist/git-ns/account/unlink/0.1/payload.d.ts +411 -0
- package/dist/git-ns/account/unlink/0.1/payload.d.ts.map +1 -0
- package/dist/git-ns/account/unlink/0.1/payload.js +228 -0
- package/dist/git-ns/account/unlink/0.1/payload.js.map +1 -0
- package/dist/git-ns/bridge/event/0.3/payload.d.ts +1682 -0
- package/dist/git-ns/bridge/event/0.3/payload.d.ts.map +1 -0
- package/dist/git-ns/bridge/event/0.3/payload.js +971 -0
- package/dist/git-ns/bridge/event/0.3/payload.js.map +1 -0
- package/dist/git-ns/bridge/job/0.4/payload.d.ts +1068 -0
- package/dist/git-ns/bridge/job/0.4/payload.d.ts.map +1 -0
- package/dist/git-ns/bridge/job/0.4/payload.js +573 -0
- package/dist/git-ns/bridge/job/0.4/payload.js.map +1 -0
- package/dist/git-ns/drift/resolve/0.3/payload.d.ts +1072 -0
- package/dist/git-ns/drift/resolve/0.3/payload.d.ts.map +1 -0
- package/dist/git-ns/drift/resolve/0.3/payload.js +634 -0
- package/dist/git-ns/drift/resolve/0.3/payload.js.map +1 -0
- package/dist/git-ns/namespace/reseat/0.3/payload.d.ts +515 -0
- package/dist/git-ns/namespace/reseat/0.3/payload.d.ts.map +1 -0
- package/dist/git-ns/namespace/reseat/0.3/payload.js +296 -0
- package/dist/git-ns/namespace/reseat/0.3/payload.js.map +1 -0
- package/dist/git-ns/repo/create/0.3/payload.d.ts +1101 -0
- package/dist/git-ns/repo/create/0.3/payload.d.ts.map +1 -0
- package/dist/git-ns/repo/create/0.3/payload.js +646 -0
- package/dist/git-ns/repo/create/0.3/payload.js.map +1 -0
- package/dist/git-ns/right/break-glass/0.1/payload.d.ts +685 -0
- package/dist/git-ns/right/break-glass/0.1/payload.d.ts.map +1 -0
- package/dist/git-ns/right/break-glass/0.1/payload.js +397 -0
- package/dist/git-ns/right/break-glass/0.1/payload.js.map +1 -0
- package/dist/git-ns/right/break-glass-notice/0.1/payload.d.ts +384 -0
- package/dist/git-ns/right/break-glass-notice/0.1/payload.d.ts.map +1 -0
- package/dist/git-ns/right/break-glass-notice/0.1/payload.js +216 -0
- package/dist/git-ns/right/break-glass-notice/0.1/payload.js.map +1 -0
- package/dist/git-ns/right/grant/0.3/payload.d.ts +678 -0
- package/dist/git-ns/right/grant/0.3/payload.d.ts.map +1 -0
- package/dist/git-ns/right/grant/0.3/payload.js +383 -0
- package/dist/git-ns/right/grant/0.3/payload.js.map +1 -0
- package/dist/git-ns/right/ratify/0.1/payload.d.ts +702 -0
- package/dist/git-ns/right/ratify/0.1/payload.d.ts.map +1 -0
- package/dist/git-ns/right/ratify/0.1/payload.js +404 -0
- package/dist/git-ns/right/ratify/0.1/payload.js.map +1 -0
- package/dist/git-ns/right/revoke/0.3/payload.d.ts +664 -0
- package/dist/git-ns/right/revoke/0.3/payload.d.ts.map +1 -0
- package/dist/git-ns/right/revoke/0.3/payload.js +378 -0
- package/dist/git-ns/right/revoke/0.3/payload.js.map +1 -0
- package/dist/git-ns/roles/reproject/0.1/payload.d.ts +325 -0
- package/dist/git-ns/roles/reproject/0.1/payload.d.ts.map +1 -0
- package/dist/git-ns/roles/reproject/0.1/payload.js +176 -0
- package/dist/git-ns/roles/reproject/0.1/payload.js.map +1 -0
- package/dist/git-ns/view/0.1/payload.d.ts +2 -2
- package/dist/git-ns/view/0.1/payload.js +2 -2
- package/dist/git-ns/view/0.1/payload.js.map +1 -1
- package/dist/git-ns/view/0.2/payload.d.ts +2 -2
- package/dist/git-ns/view/0.2/payload.js +2 -2
- package/dist/git-ns/view/0.2/payload.js.map +1 -1
- package/dist/git-ns/view/0.3/payload.d.ts +2 -2
- package/dist/git-ns/view/0.3/payload.js +2 -2
- package/dist/git-ns/view/0.3/payload.js.map +1 -1
- package/dist/git-ns/view/0.4/payload.d.ts +1696 -0
- package/dist/git-ns/view/0.4/payload.d.ts.map +1 -0
- package/dist/git-ns/view/0.4/payload.js +1012 -0
- package/dist/git-ns/view/0.4/payload.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -1
- package/dist/messaging/message/status/0.1/payload.d.ts +372 -0
- package/dist/messaging/message/status/0.1/payload.d.ts.map +1 -0
- package/dist/messaging/message/status/0.1/payload.js +214 -0
- package/dist/messaging/message/status/0.1/payload.js.map +1 -0
- package/dist/vta/_shared/0.3/did-key-roles.d.ts +16 -0
- package/dist/vta/_shared/0.3/did-key-roles.d.ts.map +1 -0
- package/dist/vta/_shared/0.3/did-key-roles.js +6 -0
- package/dist/vta/_shared/0.3/did-key-roles.js.map +1 -0
- package/dist/vta/attestation/mnemonic-export/1.0/payload.d.ts +326 -0
- package/dist/vta/attestation/mnemonic-export/1.0/payload.d.ts.map +1 -0
- package/dist/vta/attestation/mnemonic-export/1.0/payload.js +175 -0
- package/dist/vta/attestation/mnemonic-export/1.0/payload.js.map +1 -0
- package/dist/vta/webvh/dids/keys/add/1.0/payload.d.ts +1914 -0
- package/dist/vta/webvh/dids/keys/add/1.0/payload.d.ts.map +1 -0
- package/dist/vta/webvh/dids/keys/add/1.0/payload.js +1128 -0
- package/dist/vta/webvh/dids/keys/add/1.0/payload.js.map +1 -0
- package/dist/vta/webvh/dids/keys/list/1.0/payload.d.ts +1603 -0
- package/dist/vta/webvh/dids/keys/list/1.0/payload.d.ts.map +1 -0
- package/dist/vta/webvh/dids/keys/list/1.0/payload.js +942 -0
- package/dist/vta/webvh/dids/keys/list/1.0/payload.js.map +1 -0
- package/dist/vta/webvh/dids/keys/retire/1.0/payload.d.ts +1914 -0
- package/dist/vta/webvh/dids/keys/retire/1.0/payload.d.ts.map +1 -0
- package/dist/vta/webvh/dids/keys/retire/1.0/payload.js +1123 -0
- package/dist/vta/webvh/dids/keys/retire/1.0/payload.js.map +1 -0
- package/dist/vta/webvh/dids/keys/revoke/1.0/payload.d.ts +2021 -0
- package/dist/vta/webvh/dids/keys/revoke/1.0/payload.d.ts.map +1 -0
- package/dist/vta/webvh/dids/keys/revoke/1.0/payload.js +1168 -0
- package/dist/vta/webvh/dids/keys/revoke/1.0/payload.js.map +1 -0
- package/dist/vta/webvh/dids/rotate-keys/2.0/payload.d.ts +1992 -0
- package/dist/vta/webvh/dids/rotate-keys/2.0/payload.d.ts.map +1 -0
- package/dist/vta/webvh/dids/rotate-keys/2.0/payload.js +1151 -0
- package/dist/vta/webvh/dids/rotate-keys/2.0/payload.js.map +1 -0
- package/dist/vta/webvh/dids/update/2.0/payload.d.ts +1062 -0
- package/dist/vta/webvh/dids/update/2.0/payload.d.ts.map +1 -0
- package/dist/vta/webvh/dids/update/2.0/payload.js +616 -0
- package/dist/vta/webvh/dids/update/2.0/payload.js.map +1 -0
- package/dist/vtc/credentials/reissue/0.1/payload.d.ts +502 -0
- package/dist/vtc/credentials/reissue/0.1/payload.d.ts.map +1 -0
- package/dist/vtc/credentials/reissue/0.1/payload.js +282 -0
- package/dist/vtc/credentials/reissue/0.1/payload.js.map +1 -0
- package/dist/vtc/members/personhood/challenge/0.1/payload.d.ts +2 -2
- package/dist/vtc/members/personhood/challenge/0.1/payload.js +2 -2
- package/dist/vtc/members/personhood/challenge/0.1/payload.js.map +1 -1
- package/dist/vtc/vetting/vetters/profile/0.1/payload.d.ts +2 -2
- package/dist/vtc/vetting/vetters/profile/0.1/payload.js +2 -2
- package/dist/vtc/vetting/vetters/profile/0.1/payload.js.map +1 -1
- package/dist/vtc/vetting/vetters/resend/0.1/payload.d.ts +2 -2
- package/dist/vtc/vetting/vetters/resend/0.1/payload.js +2 -2
- package/dist/vtc/vetting/vetters/resend/0.1/payload.js.map +1 -1
- package/package.json +1 -1
- package/src/_shared/components.ts +313 -2
- package/src/auth/passkey/enroll/invite/0.2/payload.ts +325 -0
- package/src/auth/passkey/enroll/redeem/finish/0.1/payload.ts +499 -0
- package/src/auth/passkey/enroll/redeem/start/0.1/payload.ts +700 -0
- package/src/auth/passkey/revoke/finish/0.2/payload.ts +379 -0
- package/src/auth/passkey/revoke/start/0.2/payload.ts +349 -0
- package/src/auth/step-up/approve-response/0.5/payload.ts +593 -0
- package/src/device/list/0.1/payload.ts +4 -2
- package/src/device/list/0.2/payload.ts +4 -2
- package/src/device/register/0.1/payload.ts +4 -2
- package/src/device/register/0.2/payload.ts +4 -2
- package/src/git-ns/_shared/0.4/git-ns.ts +17 -0
- package/src/git-ns/account/link-status/0.1/payload.ts +2 -2
- package/src/git-ns/account/unlink/0.1/payload.ts +274 -0
- package/src/git-ns/bridge/event/0.3/payload.ts +1132 -0
- package/src/git-ns/bridge/job/0.4/payload.ts +691 -0
- package/src/git-ns/drift/resolve/0.3/payload.ts +707 -0
- package/src/git-ns/namespace/reseat/0.3/payload.ts +342 -0
- package/src/git-ns/repo/create/0.3/payload.ts +706 -0
- package/src/git-ns/right/break-glass/0.1/payload.ts +443 -0
- package/src/git-ns/right/break-glass-notice/0.1/payload.ts +258 -0
- package/src/git-ns/right/grant/0.3/payload.ts +434 -0
- package/src/git-ns/right/ratify/0.1/payload.ts +455 -0
- package/src/git-ns/right/revoke/0.3/payload.ts +425 -0
- package/src/git-ns/roles/reproject/0.1/payload.ts +220 -0
- package/src/git-ns/view/0.1/payload.ts +2 -2
- package/src/git-ns/view/0.2/payload.ts +2 -2
- package/src/git-ns/view/0.3/payload.ts +2 -2
- package/src/git-ns/view/0.4/payload.ts +1075 -0
- package/src/index.ts +30 -0
- package/src/messaging/message/status/0.1/payload.ts +270 -0
- package/src/vta/_shared/0.3/did-key-roles.ts +17 -0
- package/src/vta/attestation/mnemonic-export/1.0/payload.ts +232 -0
- package/src/vta/webvh/dids/keys/add/1.0/payload.ts +1217 -0
- package/src/vta/webvh/dids/keys/list/1.0/payload.ts +1004 -0
- package/src/vta/webvh/dids/keys/retire/1.0/payload.ts +1212 -0
- package/src/vta/webvh/dids/keys/revoke/1.0/payload.ts +1276 -0
- package/src/vta/webvh/dids/rotate-keys/2.0/payload.ts +1262 -0
- package/src/vta/webvh/dids/update/2.0/payload.ts +713 -0
- package/src/vtc/credentials/reissue/0.1/payload.ts +357 -0
- package/src/vtc/members/personhood/challenge/0.1/payload.ts +2 -2
- package/src/vtc/vetting/vetters/profile/0.1/payload.ts +2 -2
- 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
|
}
|