@openvtc/trust-tasks 0.26.11 → 0.26.13

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 (74) hide show
  1. package/CHANGELOG.md +303 -0
  2. package/dist/_shared/components.d.ts +18 -0
  3. package/dist/_shared/components.d.ts.map +1 -1
  4. package/dist/index.d.ts +12 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +12 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/rooms/keys/act/0.3/payload.d.ts +546 -0
  9. package/dist/rooms/keys/act/0.3/payload.d.ts.map +1 -0
  10. package/dist/rooms/keys/act/0.3/payload.js +305 -0
  11. package/dist/rooms/keys/act/0.3/payload.js.map +1 -0
  12. package/dist/rooms/owner/group/add/0.2/payload.d.ts +417 -0
  13. package/dist/rooms/owner/group/add/0.2/payload.d.ts.map +1 -0
  14. package/dist/rooms/owner/group/add/0.2/payload.js +218 -0
  15. package/dist/rooms/owner/group/add/0.2/payload.js.map +1 -0
  16. package/dist/vta/_shared/0.6/witness-party.d.ts +16 -0
  17. package/dist/vta/_shared/0.6/witness-party.d.ts.map +1 -0
  18. package/dist/vta/_shared/0.6/witness-party.js +6 -0
  19. package/dist/vta/_shared/0.6/witness-party.js.map +1 -0
  20. package/dist/vta/witness/accept/0.2/payload.d.ts +499 -0
  21. package/dist/vta/witness/accept/0.2/payload.d.ts.map +1 -0
  22. package/dist/vta/witness/accept/0.2/payload.js +278 -0
  23. package/dist/vta/witness/accept/0.2/payload.js.map +1 -0
  24. package/dist/vta/witness/list/0.1/payload.d.ts +673 -0
  25. package/dist/vta/witness/list/0.1/payload.d.ts.map +1 -0
  26. package/dist/vta/witness/list/0.1/payload.js +351 -0
  27. package/dist/vta/witness/list/0.1/payload.js.map +1 -0
  28. package/dist/vta/witness/open/0.2/payload.d.ts +500 -0
  29. package/dist/vta/witness/open/0.2/payload.d.ts.map +1 -0
  30. package/dist/vta/witness/open/0.2/payload.js +259 -0
  31. package/dist/vta/witness/open/0.2/payload.js.map +1 -0
  32. package/dist/vta/witness/present/0.2/payload.d.ts +303 -0
  33. package/dist/vta/witness/present/0.2/payload.d.ts.map +1 -0
  34. package/dist/vta/witness/present/0.2/payload.js +170 -0
  35. package/dist/vta/witness/present/0.2/payload.js.map +1 -0
  36. package/dist/vtc/members/personhood/assert/0.2/payload.d.ts +536 -0
  37. package/dist/vtc/members/personhood/assert/0.2/payload.d.ts.map +1 -0
  38. package/dist/vtc/members/personhood/assert/0.2/payload.js +228 -0
  39. package/dist/vtc/members/personhood/assert/0.2/payload.js.map +1 -0
  40. package/dist/vtc/members/registry-consent/0.1/payload.d.ts +311 -0
  41. package/dist/vtc/members/registry-consent/0.1/payload.d.ts.map +1 -0
  42. package/dist/vtc/members/registry-consent/0.1/payload.js +183 -0
  43. package/dist/vtc/members/registry-consent/0.1/payload.js.map +1 -0
  44. package/dist/vtc/members/update/0.1/payload.d.ts +3 -3
  45. package/dist/vtc/members/update/0.1/payload.js +1 -1
  46. package/dist/vtc/members/update/0.1/payload.js.map +1 -1
  47. package/dist/witness/_shared/0.1/outcome-evidence.d.ts +16 -0
  48. package/dist/witness/_shared/0.1/outcome-evidence.d.ts.map +1 -0
  49. package/dist/witness/_shared/0.1/outcome-evidence.js +6 -0
  50. package/dist/witness/_shared/0.1/outcome-evidence.js.map +1 -0
  51. package/dist/witness/session/0.2/payload.d.ts +274 -0
  52. package/dist/witness/session/0.2/payload.d.ts.map +1 -0
  53. package/dist/witness/session/0.2/payload.js +152 -0
  54. package/dist/witness/session/0.2/payload.js.map +1 -0
  55. package/dist/witness/session/submit/0.2/payload.d.ts +295 -0
  56. package/dist/witness/session/submit/0.2/payload.d.ts.map +1 -0
  57. package/dist/witness/session/submit/0.2/payload.js +166 -0
  58. package/dist/witness/session/submit/0.2/payload.js.map +1 -0
  59. package/package.json +1 -1
  60. package/src/_shared/components.ts +17 -0
  61. package/src/index.ts +12 -0
  62. package/src/rooms/keys/act/0.3/payload.ts +380 -0
  63. package/src/rooms/owner/group/add/0.2/payload.ts +288 -0
  64. package/src/vta/_shared/0.6/witness-party.ts +17 -0
  65. package/src/vta/witness/accept/0.2/payload.ts +330 -0
  66. package/src/vta/witness/list/0.1/payload.ts +441 -0
  67. package/src/vta/witness/open/0.2/payload.ts +336 -0
  68. package/src/vta/witness/present/0.2/payload.ts +210 -0
  69. package/src/vtc/members/personhood/assert/0.2/payload.ts +421 -0
  70. package/src/vtc/members/registry-consent/0.1/payload.ts +231 -0
  71. package/src/vtc/members/update/0.1/payload.ts +2 -2
  72. package/src/witness/_shared/0.1/outcome-evidence.ts +17 -0
  73. package/src/witness/session/0.2/payload.ts +197 -0
  74. package/src/witness/session/submit/0.2/payload.ts +212 -0
package/CHANGELOG.md CHANGED
@@ -11,6 +11,309 @@ 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.26.13 — 2026-10-16
15
+
16
+
17
+ ### Added
18
+
19
+ - **vta/witness**: List — read back stored witness credentials with their outcome evidence (#800)
20
+
21
+ vta/witness/accept stores a VWC with its outcome evidence (the
22
+ witness/session document and the witness's submit #response), and its
23
+ answer was the client's only copy of that evidence: vault/credentials/query
24
+ returns body-free descriptors and vault/credentials/get the credential alone.
25
+ A client that stopped between accept returning and recording the result, or
26
+ another device of the same principal, could see the VWC and not present it,
27
+ since a VWC without its evidence counts for nothing at a verifier.
28
+
29
+ vta/witness/list/0.1 returns every stored VWC the caller may read, each as
30
+ accept answered it (credentialId, witness, relationshipDid,
31
+ vwcDigestMultibase) plus acceptedAt and the evidence byte for byte, the VWC
32
+ travelling once inside evidence.outcome. Filters relationshipDid and witness
33
+ (AND-combined); pageSize (<= 100) / cursor / truncated as vta/credentials/list.
34
+ Only VWCs in contexts the caller may act in (witnessRequest, never sign alone),
35
+ active vault entries only; an unreachable or unknown DID matches nothing,
36
+ never an error. Lists VWCs accepted under 0.1 and 0.2 alike. A read:
37
+ sideEffects none, discloses secret, so request and response proofs and
38
+ issuedAt are REQUIRED; retention transient.
39
+
40
+ accept/0.2's "Reading the evidence back later" and the 0.6 conventions now
41
+ point at it. Bindings regenerated (Rust, TS, Go, Dart).
42
+
43
+ ## 0.26.12 — 2026-10-16
44
+
45
+
46
+ ### Added
47
+
48
+ - **vtc/members**: Registry-consent — a member grants or withdraws their own trust-registry consent (#798)
49
+
50
+
51
+ ### Documentation
52
+
53
+ - **keys**: Sign-jws and sign-csr name their known implementation (#792)
54
+
55
+ keys/sign-jws/0.1 and keys/sign-csr/0.1 declared no knownImplementations,
56
+ so the registry showed "Not declared" for both, although a runtime
57
+ implementation exists: OpenVTC/verifiable-trust-infrastructure#2057 (VTA
58
+ custodian; merged 2026-10-13 at dda501d) serves both tasks. Its test
59
+ suite reproduces the sign-jws example's signing input and SHA-256 digest,
60
+ and checks that a sign-csr request's signature verifies.
61
+
62
+ Front matter only; no wire or binding change.
63
+
64
+
65
+
66
+ ### Specifications
67
+
68
+ - **witness**: Add 0.2 — a member presentation on submit, and outcome evidence on personhood/assert, replace the ext stop-gaps (#799)
69
+
70
+ Two members implementations carried in a vendor extension,
71
+ ext["org.openvtc.witness"], become specified members, so any witness and
72
+ any community reads them.
73
+
74
+ - witness/session/submit/0.2: optional memberPresentation — a VP by the
75
+ member DID, for authentication, bound to the session's challenge and
76
+ domain, carrying the eligibility credentials (a membership credential
77
+ naming the member DID). Neither party nor the witness; a failure where
78
+ relied on is presentationInvalid; a witness not using it MUST NOT treat it
79
+ as satisfying anything. The member DID never appears in the VWC, and the
80
+ witness keeps neither it nor the presentation. Privacy: links the pairwise
81
+ relationship DID to the member DID at the witness; proves co-possession in
82
+ one session, not one person; the alternatives are recorded.
83
+ - witness/session/0.2: same payload; its outcomeEvidence names
84
+ submit/0.2#response. The declaration belongs to the initiating document's
85
+ specification (SPEC §7.3 item 20, §4.9.4 check 3), so a 0.1 session cannot
86
+ close with a 0.2 submit. Versions pair one to one.
87
+ - vtc/members/personhood/assert/0.2: optional outcomeEvidence (1–16
88
+ entries, each {session, outcome} carried byte for byte). A VWC counts only
89
+ from a trusted witness, paired by §4.9.4's four checks and the witnessing
90
+ checks; unpaired entries are ignored. A member presents only the VWCs it
91
+ selects.
92
+ - witness/_shared/0.1/outcome-evidence: OutcomeEvidence, shared by
93
+ personhood/assert/0.2 and vta/witness/accept/0.2.
94
+ - vta/witness/{open,present,accept}/0.2 + vta/_shared/0.6 conventions:
95
+ conduct 0.2 sessions; present puts the member presentation in
96
+ memberPresentation; open drops memberLinkUnsupported; a 0.2 session is
97
+ continued only by 0.2 tasks. The 0.1 tasks are unchanged.
98
+
99
+ Bindings regenerated (Rust, TS, Go, Dart).
100
+
101
+ - **rooms/keys**: Act 0.3 — a member takes up a community's offer of a room as themself, with only a KeyPackage their key holder minted (#797)
102
+
103
+ `vtc/rooms/offers/list/0.1` and `vtc/rooms/offers/accept/0.1` must be signed
104
+ as the DID the community addressed its offer to. That DID is the member as
105
+ the community knows them — typically a persona their key holder holds — so
106
+ no surface the member acts from can sign either, and `rooms/keys/act/0.2`
107
+ could not complete them: its `type` pattern admits only `rooms/`, and its
108
+ closed table lists neither. A member could be offered a room and never
109
+ reach it.
110
+
111
+ act 0.3:
112
+ - The table gains `vtc/rooms/offers/list/0.1` and
113
+ `vtc/rooms/offers/accept/0.1`, with no presentation inserted: the member
114
+ holds no room authority yet, and the community checks the offer against
115
+ the document's proof. The `type` pattern admits `vtc/rooms/offers/` beside
116
+ `rooms/` and nothing else of the vtc family (new invalid example: an
117
+ administrator's `vtc/rooms/community/members/add` is refused by schema).
118
+ - Producer item 2: `issuer` REQUIRED for the offer types (the DID the offer
119
+ is addressed to); `recipient` is the community.
120
+ - Recipient item 2b (new): for the offer types, act as `issuer` iff the
121
+ recipient holds a key `issuer`'s DID document lists for `authentication`
122
+ and the caller may act as it; `issuerNotPrincipal` otherwise,
123
+ `principalAmbiguous` when absent; never pick for the caller. No room
124
+ credential is required.
125
+ - Recipient item 10 / Producer item 5 (new): an acceptance's `keyPackage`
126
+ is completed only when the recipient minted it with rooms/keys/key-package
127
+ for that room and that member and still holds its private half (unused,
128
+ unexpired), compared by KeyPackageRef, never by its leaf credential;
129
+ otherwise the new code `keyPackageNotHeld`.
130
+ - Security & Privacy: why item 10 is required — a KeyPackage the key holder
131
+ did not mint becomes the member's leaf with keys someone else holds (the
132
+ client), opening every later record and signing group messages as the
133
+ member outside the key holder and beyond any withdrawal of the client's
134
+ standing; the leaf credential is signed by the leaf key, not the member's
135
+ DID, so the community cannot tell, and only the minting key holder can.
136
+ And why the offer types belong in act rather than a task of their own:
137
+ same entitlement, same delegate refusal (item 3), same closed table — one
138
+ signing-as-the-member surface to audit, not two — and a key holder that
139
+ accepted itself would call the community and route the answer, which item
140
+ 7 rules out.
141
+ - Examples: an acceptance completed as the member; a `keyPackageNotHeld`
142
+ refusal.
143
+
144
+ vtc/rooms/offers/{list,accept}/0.1, in place: one paragraph each under
145
+ Authorization pointing a surface without the member's keys at act 0.3.
146
+ Prose only; their wire is unchanged (SPEC §5.2 editorial, as #783).
147
+
148
+ - **vtc/rooms/community/members/remove**: The answer says what removal did in its structured members, not in a notice — clarified in place (#796)
149
+
150
+ Item 4 required the community to "say in its record and its answer that
151
+ removal does not recall what was read", but the response schema has no
152
+ member to say it in (`additionalProperties: false`). An implementation
153
+ could comply only through `ext`, which a caller cannot depend on — so the
154
+ requirement promised callers something the wire never guaranteed.
155
+
156
+ Two ways out: add an optional `notice` member, or drop "and its answer".
157
+ This drops it, and puts the obligation where it does its work:
158
+
159
+ - Community item 4: MUST NOT represent a removal, in its record or answer,
160
+ as recalling what was read, re-sealing what was written, or revoking the
161
+ authority credential. The answer's structured members are what it says:
162
+ `member.state` `removed`, `member.validUntil` (when a host stops honouring
163
+ the authority credential), and `epoch` (sealed tier, admitted member: the
164
+ first epoch sealed without them; absent means nothing was withdrawn
165
+ cryptographically — an open room, or a withdrawn offer).
166
+ - Producer (new): the administrator's surface SHOULD show what removal does
167
+ and does not do on the room's tier, and the member's `validUntil`, before
168
+ the request is signed and before any step-up gesture bound to it; SHOULD
169
+ report the answer from `validUntil`/`epoch`; MUST NOT report any removal
170
+ as ending access to what was already read.
171
+ - New subsection *Why the answer carries no notice*.
172
+
173
+ Why not a field: the statement is identical for every removal on a tier, so
174
+ it carries nothing the caller cannot render from the specification, the
175
+ tier, `validUntil` and `epoch`; as a field it would be server-chosen,
176
+ unlocalised prose shown to an administrator as guidance; and it would
177
+ arrive after the decision. The moment it matters is before the requester
178
+ commits, when a bound step-up ties them to this one document — which is a
179
+ producer obligation, not a response member. An implementation MAY still
180
+ carry a statement under `ext`; a caller MUST NOT depend on one.
181
+
182
+ - **rooms/owner/group**: Add 0.2 — a repeated admission is answered with its Welcome, not alreadyMember (#795)
183
+
184
+ `rooms/owner/group/add/0.1` item 6 settles a pending admission at the next
185
+ request, which keeps the room and the owner's group in step across a lost
186
+ host reply. But the next request is, in the case that matters, the same
187
+ request again: the caller lost the answer and retries. 0.1 settled the
188
+ pending admission, found `member` already in the group, and refused the
189
+ retry `alreadyMember`. The Welcome — the only way the newcomer can join —
190
+ was returned to nobody. The same happens when the recipient applied the
191
+ admission and its own reply to its caller was lost. `vtc/rooms/offers/accept`
192
+ already promises its callers that retrying is safe; under 0.1 it was not.
193
+
194
+ add 0.2:
195
+ - Item 8 (new): the recipient keeps, with the group state, the last
196
+ admission it applied for the room — `member`, the KeyPackage's
197
+ `KeyPackageRef` (RFC 9420 §5.2), epoch, Welcome and ratchet tree — until
198
+ its next advance of the room or 24 hours, whichever comes first. A request
199
+ naming the same room, the same `member` (string-equal) and a KeyPackage of
200
+ the same `KeyPackageRef` is answered, once item 1 and the authorization
201
+ checks pass, with that admission's epoch, Welcome and tree; the recipient
202
+ does not advance the room, contact the host, change its group or build a
203
+ fresh Welcome. Anything else for a member with a leaf is `alreadyMember`.
204
+ - Item 6 hands over to item 8 when the pending admission it applies is the
205
+ one the request repeats.
206
+ - New section *Repeating an admission*: why re-serving is safe (the Welcome
207
+ is HPKE-sealed to the KeyPackage's init key and addressed by its
208
+ KeyPackageRef, RFC 9420 §12.4.3.1; the joiner discards the private half on
209
+ use or expiry, so a late copy opens nothing), why the match is exact (equal
210
+ KeyPackageRefs mean byte-identical KeyPackages, hence the same init key; a
211
+ different KeyPackage for the same member would be a second leaf), and why
212
+ retention is short.
213
+ - `alreadyMember` and `hostUnreachable` meanings updated; retention and
214
+ exposure rationales say what is kept. No code added; payload and response
215
+ schemas unchanged.
216
+
217
+ vtc/rooms/offers/accept/0.1, in place: "Repeating an accept" now points at
218
+ group/add 0.2 items 6 and 8, says the community repeats its own request to
219
+ its VTA unchanged, and that the community's VTA serves group/add at 0.2 or
220
+ later. Prose only; its wire is unchanged, and it now describes what its own
221
+ existing retry promise requires (SPEC §5.2 editorial, as #783).
222
+
223
+ - **vtc/vetting/vetters/pcs-root**: A member may recover a lost enrolment answer within the same label (#791)
224
+
225
+ pcs-root/0.1 refused every second enrolment under a label as
226
+ alreadyEnrolled. That is right for counting, but it made a lost answer
227
+ unrecoverable for the rest of the label: if the community issued and the
228
+ answer never reached the vetter in a form it could open (late arrival, a
229
+ client restart losing the blinding state, a transport drop), the vetter
230
+ held no credential and was locked out of hidden vetting until the next
231
+ vetter/<YYYY-MM> label. This happened in a live run.
232
+
233
+ vtc/vetting/vetters/pcs-root/0.1 (draft, in place per SPEC §5.2), new
234
+ "Recovering a lost answer" section under Authorization:
235
+ - A community MAY answer a second request under a label the member is
236
+ enrolled in with a fresh issuance over the new blinded request, when its
237
+ `id` is the one recorded for the member. Every first-enrolment check still
238
+ applies (live grant, proof, issuedAt, wrongLabel, badRequest).
239
+ - It MUST NOT re-issue unless its suite binds the blinded request to the
240
+ secret `id` is derived from, so every credential under one `id` yields
241
+ the same tags. That binding is what stops a re-issue counting as a second
242
+ vetter; without it the community refuses with alreadyEnrolled.
243
+ - A different `id` is still identifierRebound. No second enrolment is
244
+ recorded. Re-issues SHOULD be bounded per member per label, refused beyond
245
+ the bound with alreadyEnrolled, and audited.
246
+ - What this gives up is "exactly one credential object per member per
247
+ label", not "each member counted once". Distinctness is by tag.
248
+ - Client note: re-run vta/pcs/root-request for the label (it replaces the
249
+ blinding state and keeps the key, so the `id`), send, and pass the answer
250
+ to vta/pcs/root-accept. alreadyEnrolled now means the community does not
251
+ re-issue, or no longer will for this label.
252
+
253
+ The alreadyEnrolled meaning, the proof rationale and the "record only after
254
+ signing" note say the same. hidden/publish/0.1's pointer to pcs-root no
255
+ longer says a second enrolment is impossible. Bindings regenerated.
256
+
257
+ The issue's alternative, an administrator task to clear an enrolment, is
258
+ not taken: re-issuance under the same `id` recovers without an operator
259
+ and without a record of the member's enrolment being erased.
260
+
261
+ - **vtc/join-requests**: Submit and supplement say why a hidden-vetting challenge was refused (#790)
262
+
263
+ A hidden-vetting proof is bound to a single-use challenge issued over
264
+ vtc/vetting/pcs-challenge, and the community spends that challenge when it
265
+ counts the proof. Neither vtc/join-requests/submit nor
266
+ vtc/join-requests/supplement declared a code for a refused challenge, so
267
+ implementations fell back to malformedRequest. An applicant could not tell
268
+ an expired challenge from a spent one, or either from a client bug.
269
+
270
+ submit/0.2, submit/0.3 and supplement/0.1 (draft, in place per SPEC §5.2)
271
+ each declare four codes under the task's own name, none retryable:
272
+ - challengeNotIssued: no challenge held for the applicant's DID;
273
+ - challengeAlreadyUsed: spent by an earlier submission or supplement;
274
+ - challengeExpired: past expiresAt, details MAY carry expiredAt (the
275
+ details schema does not close the object, so an implementation's own
276
+ markers still validate);
277
+ - challengeMismatch: bound to a value other than the open challenge,
278
+ which this attempt spends.
279
+
280
+ A new "Hidden-vetting challenge" section in each says where the proof
281
+ travels (extensions.hiddenVetting), that counting it spends the open
282
+ challenge whether or not the applicant is then admitted, that the message
283
+ never echoes the challenge value, that the value is discarded on use, and
284
+ that a value-free spent marker MAY be kept until expiry so a repeat attempt
285
+ is told challengeAlreadyUsed rather than challengeNotIssued. Recovery is a
286
+ new challenge and a new proof. submit/0.3 adds that a producer SHOULD name
287
+ its criterion on a hidden-vetting submission. supplement/0.1's
288
+ `extensions` is no longer described as wholly uninterpreted, and
289
+ pcs-challenge/0.1's Retention permits the spent marker and points at the
290
+ codes.
291
+
292
+ The issue's note about several hidden-vetting criteria spending one
293
+ challenge is moot: vtc/vetting/hidden/publish refuses a second criterion
294
+ (otherCriterion, #734). Bindings regenerated (Rust ERROR_CODES).
295
+
296
+ - **vtc/members/update**: PublishConsent may be withdrawn by an administrator, never granted — consentGrantForbidden (#789)
297
+
298
+ A member's consent to trust-registry publication is the member's own
299
+ privacy decision, given with `registryConsent` on vtc/join-requests/submit.
300
+ update/0.1 listed `publishConsent` among the fields an administrator may
301
+ change with no direction, so an administrator could raise it and publish
302
+ someone who said no.
303
+
304
+ vtc/members/update/0.1 (draft, in place per SPEC §5.2):
305
+ - `publishConsent` MAY lower consent (true -> false, e.g. a takedown) and
306
+ MAY restate the current value. It MUST NOT raise it: consent becomes true
307
+ only through the member's own registryConsent on a join submit, including
308
+ a rejoin, which writes a fresh member record.
309
+ - New error vtc/members/update:consentGrantForbidden (not retryable),
310
+ checked after notFound and adminRoleForbidden. A refused raise rejects the
311
+ whole update; no other field in the request is applied.
312
+ - A withdrawal: the community SHOULD remove the member's published registry
313
+ record at its next sync, and MUST NOT publish the member again until the
314
+ member consents anew.
315
+ - Security & Privacy says why consent runs one way. Bindings regenerated.
316
+
14
317
  ## 0.26.11 — 2026-10-16
15
318
 
16
319
 
@@ -5537,6 +5537,11 @@ export interface EpochLink {
5537
5537
  */
5538
5538
  nonce: string;
5539
5539
  }
5540
+ /**
5541
+ * A whole Trust Task document — `id`, `type`, `payload` and every other member, `proof` included — carried exactly as it was sent or received, never re-serialised: a task digest and a proof are taken over its members, and a re-serialised copy reproduces neither reliably. Typed as an open object so every member survives; the checks that give it meaning belong to the task that reads it.
5542
+ */
5543
+ export interface EvidenceDocument {
5544
+ }
5540
5545
  /**
5541
5546
  * The authoritative SPEC §7.3 item 14 exposure class of the pending task, derived by the executor from the compiled handler it is about to invoke — never from the registry's declared value.
5542
5547
  */
@@ -6617,6 +6622,19 @@ export interface OfferCredentials {
6617
6622
  */
6618
6623
  authority: string;
6619
6624
  }
6625
+ /**
6626
+ * One witnessing session's outcome evidence. `session` is the initiating witness/session document; `outcome` is the terminal witness/session/submit #response that the initiating document's own specification declares as its outcome evidence, under the witness's proof, delivering the VWC and its vwcDigestMultibase. A consumer pairs them with a presented VWC by SPEC §4.9.4's four checks and the witnessing checks of witness/session/submit (This response is the outcome evidence).
6627
+ */
6628
+ export interface OutcomeEvidence {
6629
+ /**
6630
+ * The witness/session document that opened the session. The VWC's taskContext is its id and its taskDigestMultibase is computed over it (SPEC §4.9.3).
6631
+ */
6632
+ session: EvidenceDocument;
6633
+ /**
6634
+ * The witness/session/submit #response that closed the session, under the witness's proof. It carries the VWC and its vwcDigestMultibase.
6635
+ */
6636
+ outcome: EvidenceDocument;
6637
+ }
6620
6638
  /**
6621
6639
  * How the uploader will cut a blob for direct transfer, committed before any byte moves: one storage object, written in `partCount` parts of `partSize` bytes (the last may be shorter), each with its digest. Independent of the chunk manifest, because storage imposes part sizes a chunk document cannot carry; the chunk manifest still describes the blob and readers still check it.
6622
6640
  *