@openvtc/trust-tasks 0.26.19 → 0.26.21

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 (219) hide show
  1. package/CHANGELOG.md +106 -0
  2. package/dist/_shared/components.d.ts +328 -17
  3. package/dist/_shared/components.d.ts.map +1 -1
  4. package/dist/device/list/0.2/payload.d.ts +4 -4
  5. package/dist/device/list/0.2/payload.d.ts.map +1 -1
  6. package/dist/device/list/0.2/payload.js +4 -2
  7. package/dist/device/list/0.2/payload.js.map +1 -1
  8. package/dist/device/register/0.2/payload.d.ts +4 -4
  9. package/dist/device/register/0.2/payload.d.ts.map +1 -1
  10. package/dist/device/register/0.2/payload.js +4 -2
  11. package/dist/device/register/0.2/payload.js.map +1 -1
  12. package/dist/index.d.ts +24 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +24 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/voting/_shared/0.1/voting.d.ts +16 -0
  17. package/dist/voting/_shared/0.1/voting.d.ts.map +1 -0
  18. package/dist/voting/_shared/0.1/voting.js +6 -0
  19. package/dist/voting/_shared/0.1/voting.js.map +1 -0
  20. package/dist/voting/ballot/cast/0.1/payload.d.ts +887 -0
  21. package/dist/voting/ballot/cast/0.1/payload.d.ts.map +1 -0
  22. package/dist/voting/ballot/cast/0.1/payload.js +506 -0
  23. package/dist/voting/ballot/cast/0.1/payload.js.map +1 -0
  24. package/dist/voting/board/consistency/0.1/payload.d.ts +389 -0
  25. package/dist/voting/board/consistency/0.1/payload.d.ts.map +1 -0
  26. package/dist/voting/board/consistency/0.1/payload.js +218 -0
  27. package/dist/voting/board/consistency/0.1/payload.js.map +1 -0
  28. package/dist/voting/board/head/0.1/payload.d.ts +380 -0
  29. package/dist/voting/board/head/0.1/payload.d.ts.map +1 -0
  30. package/dist/voting/board/head/0.1/payload.js +224 -0
  31. package/dist/voting/board/head/0.1/payload.js.map +1 -0
  32. package/dist/voting/board/inclusion/0.1/payload.d.ts +449 -0
  33. package/dist/voting/board/inclusion/0.1/payload.d.ts.map +1 -0
  34. package/dist/voting/board/inclusion/0.1/payload.js +246 -0
  35. package/dist/voting/board/inclusion/0.1/payload.js.map +1 -0
  36. package/dist/voting/board/read/0.1/payload.d.ts +1596 -0
  37. package/dist/voting/board/read/0.1/payload.d.ts.map +1 -0
  38. package/dist/voting/board/read/0.1/payload.js +920 -0
  39. package/dist/voting/board/read/0.1/payload.js.map +1 -0
  40. package/dist/voting/election/cancel/0.1/payload.d.ts +540 -0
  41. package/dist/voting/election/cancel/0.1/payload.d.ts.map +1 -0
  42. package/dist/voting/election/cancel/0.1/payload.js +331 -0
  43. package/dist/voting/election/cancel/0.1/payload.js.map +1 -0
  44. package/dist/voting/election/close/0.1/payload.d.ts +540 -0
  45. package/dist/voting/election/close/0.1/payload.d.ts.map +1 -0
  46. package/dist/voting/election/close/0.1/payload.js +330 -0
  47. package/dist/voting/election/close/0.1/payload.js.map +1 -0
  48. package/dist/voting/election/register/0.1/payload.d.ts +1920 -0
  49. package/dist/voting/election/register/0.1/payload.d.ts.map +1 -0
  50. package/dist/voting/election/register/0.1/payload.js +1166 -0
  51. package/dist/voting/election/register/0.1/payload.js.map +1 -0
  52. package/dist/voting/election/show/0.1/payload.d.ts +1824 -0
  53. package/dist/voting/election/show/0.1/payload.d.ts.map +1 -0
  54. package/dist/voting/election/show/0.1/payload.js +1112 -0
  55. package/dist/voting/election/show/0.1/payload.js.map +1 -0
  56. package/dist/voting/result/show/0.1/payload.d.ts +849 -0
  57. package/dist/voting/result/show/0.1/payload.d.ts.map +1 -0
  58. package/dist/voting/result/show/0.1/payload.js +498 -0
  59. package/dist/voting/result/show/0.1/payload.js.map +1 -0
  60. package/dist/vta/_shared/0.1/app-state-record.d.ts +1 -1
  61. package/dist/vta/_shared/0.1/app-state-record.d.ts.map +1 -1
  62. package/dist/vta/_shared/0.4/pcs-engine.d.ts +1 -1
  63. package/dist/vta/_shared/0.4/pcs-engine.d.ts.map +1 -1
  64. package/dist/vta/app-state/delete/1.0/payload.d.ts +1 -1
  65. package/dist/vta/app-state/delete/1.0/payload.d.ts.map +1 -1
  66. package/dist/vta/app-state/get/1.0/payload.d.ts +1 -1
  67. package/dist/vta/app-state/get/1.0/payload.d.ts.map +1 -1
  68. package/dist/vta/app-state/get-many/1.0/payload.d.ts +1 -1
  69. package/dist/vta/app-state/get-many/1.0/payload.d.ts.map +1 -1
  70. package/dist/vta/app-state/list/1.0/payload.d.ts +1 -1
  71. package/dist/vta/app-state/list/1.0/payload.d.ts.map +1 -1
  72. package/dist/vta/app-state/put/1.0/payload.d.ts +1 -1
  73. package/dist/vta/app-state/put/1.0/payload.d.ts.map +1 -1
  74. package/dist/vta/app-state/put-many/1.0/payload.d.ts +1 -1
  75. package/dist/vta/app-state/put-many/1.0/payload.d.ts.map +1 -1
  76. package/dist/vta/pcs/applications/create/0.1/payload.d.ts +1 -1
  77. package/dist/vta/pcs/applications/create/0.1/payload.d.ts.map +1 -1
  78. package/dist/vta/pcs/applications/show/0.1/payload.d.ts +1 -1
  79. package/dist/vta/pcs/applications/show/0.1/payload.d.ts.map +1 -1
  80. package/dist/vta/pcs/attest/0.1/payload.d.ts +1 -1
  81. package/dist/vta/pcs/attest/0.1/payload.d.ts.map +1 -1
  82. package/dist/vta/pcs/prove/0.1/payload.d.ts +1 -1
  83. package/dist/vta/pcs/prove/0.1/payload.d.ts.map +1 -1
  84. package/dist/vta/pcs/root-accept/0.1/payload.d.ts +1 -1
  85. package/dist/vta/pcs/root-accept/0.1/payload.d.ts.map +1 -1
  86. package/dist/vta/pcs/tokens/abandon/0.1/payload.d.ts +1 -1
  87. package/dist/vta/pcs/tokens/abandon/0.1/payload.d.ts.map +1 -1
  88. package/dist/vta/pcs/tokens/accept/0.1/payload.d.ts +1 -1
  89. package/dist/vta/pcs/tokens/accept/0.1/payload.d.ts.map +1 -1
  90. package/dist/vta/pcs/verify-attestation/0.1/payload.d.ts +1 -1
  91. package/dist/vta/pcs/verify-attestation/0.1/payload.d.ts.map +1 -1
  92. package/dist/vta/pcs/vetter/show/0.1/payload.d.ts +1 -1
  93. package/dist/vta/pcs/vetter/show/0.1/payload.d.ts.map +1 -1
  94. package/dist/vta/pcs/vote/0.1/payload.d.ts +2208 -0
  95. package/dist/vta/pcs/vote/0.1/payload.d.ts.map +1 -0
  96. package/dist/vta/pcs/vote/0.1/payload.js +1282 -0
  97. package/dist/vta/pcs/vote/0.1/payload.js.map +1 -0
  98. package/dist/vta/pcs/voter/accept/0.1/payload.d.ts +450 -0
  99. package/dist/vta/pcs/voter/accept/0.1/payload.d.ts.map +1 -0
  100. package/dist/vta/pcs/voter/accept/0.1/payload.js +247 -0
  101. package/dist/vta/pcs/voter/accept/0.1/payload.js.map +1 -0
  102. package/dist/vta/pcs/voter/receipt/0.1/payload.d.ts +531 -0
  103. package/dist/vta/pcs/voter/receipt/0.1/payload.d.ts.map +1 -0
  104. package/dist/vta/pcs/voter/receipt/0.1/payload.js +301 -0
  105. package/dist/vta/pcs/voter/receipt/0.1/payload.js.map +1 -0
  106. package/dist/vta/pcs/voter/register/0.1/payload.d.ts +1934 -0
  107. package/dist/vta/pcs/voter/register/0.1/payload.d.ts.map +1 -0
  108. package/dist/vta/pcs/voter/register/0.1/payload.js +1133 -0
  109. package/dist/vta/pcs/voter/register/0.1/payload.js.map +1 -0
  110. package/dist/vtc/directory/card/present/0.1/payload.d.ts +2 -2
  111. package/dist/vtc/directory/card/present/0.1/payload.js +1 -1
  112. package/dist/vtc/directory/card/present/0.1/payload.js.map +1 -1
  113. package/dist/vtc/directory/card/public/0.1/payload.d.ts +4 -4
  114. package/dist/vtc/directory/card/public/0.1/payload.js +2 -2
  115. package/dist/vtc/directory/card/public/0.1/payload.js.map +1 -1
  116. package/dist/vtc/directory/card/publish/0.1/payload.d.ts +4 -4
  117. package/dist/vtc/directory/card/publish/0.1/payload.js +2 -2
  118. package/dist/vtc/directory/card/publish/0.1/payload.js.map +1 -1
  119. package/dist/vtc/elections/cancel/0.1/payload.d.ts +301 -0
  120. package/dist/vtc/elections/cancel/0.1/payload.d.ts.map +1 -0
  121. package/dist/vtc/elections/cancel/0.1/payload.js +183 -0
  122. package/dist/vtc/elections/cancel/0.1/payload.js.map +1 -0
  123. package/dist/vtc/elections/certify/0.1/payload.d.ts +914 -0
  124. package/dist/vtc/elections/certify/0.1/payload.d.ts.map +1 -0
  125. package/dist/vtc/elections/certify/0.1/payload.js +512 -0
  126. package/dist/vtc/elections/certify/0.1/payload.js.map +1 -0
  127. package/dist/vtc/elections/close/0.1/payload.d.ts +301 -0
  128. package/dist/vtc/elections/close/0.1/payload.d.ts.map +1 -0
  129. package/dist/vtc/elections/close/0.1/payload.js +182 -0
  130. package/dist/vtc/elections/close/0.1/payload.js.map +1 -0
  131. package/dist/vtc/elections/create/0.1/payload.d.ts +1656 -0
  132. package/dist/vtc/elections/create/0.1/payload.d.ts.map +1 -0
  133. package/dist/vtc/elections/create/0.1/payload.js +994 -0
  134. package/dist/vtc/elections/create/0.1/payload.js.map +1 -0
  135. package/dist/vtc/elections/list/0.1/payload.d.ts +521 -0
  136. package/dist/vtc/elections/list/0.1/payload.d.ts.map +1 -0
  137. package/dist/vtc/elections/list/0.1/payload.js +290 -0
  138. package/dist/vtc/elections/list/0.1/payload.js.map +1 -0
  139. package/dist/vtc/elections/show/0.1/payload.d.ts +2688 -0
  140. package/dist/vtc/elections/show/0.1/payload.d.ts.map +1 -0
  141. package/dist/vtc/elections/show/0.1/payload.js +1581 -0
  142. package/dist/vtc/elections/show/0.1/payload.js.map +1 -0
  143. package/dist/vtc/elections/tickets/issue/0.1/payload.d.ts +597 -0
  144. package/dist/vtc/elections/tickets/issue/0.1/payload.d.ts.map +1 -0
  145. package/dist/vtc/elections/tickets/issue/0.1/payload.js +318 -0
  146. package/dist/vtc/elections/tickets/issue/0.1/payload.js.map +1 -0
  147. package/dist/vtc/groups/create/0.1/payload.d.ts +4 -4
  148. package/dist/vtc/groups/create/0.1/payload.js +2 -2
  149. package/dist/vtc/groups/create/0.1/payload.js.map +1 -1
  150. package/dist/vtc/groups/list/0.1/payload.d.ts +4 -4
  151. package/dist/vtc/groups/list/0.1/payload.js +2 -2
  152. package/dist/vtc/groups/list/0.1/payload.js.map +1 -1
  153. package/dist/vtc/groups/managers/add/0.1/payload.d.ts +337 -0
  154. package/dist/vtc/groups/managers/add/0.1/payload.d.ts.map +1 -0
  155. package/dist/vtc/groups/managers/add/0.1/payload.js +184 -0
  156. package/dist/vtc/groups/managers/add/0.1/payload.js.map +1 -0
  157. package/dist/vtc/groups/managers/remove/0.1/payload.d.ts +337 -0
  158. package/dist/vtc/groups/managers/remove/0.1/payload.d.ts.map +1 -0
  159. package/dist/vtc/groups/managers/remove/0.1/payload.js +184 -0
  160. package/dist/vtc/groups/managers/remove/0.1/payload.js.map +1 -0
  161. package/dist/vtc/groups/show/0.1/payload.d.ts +4 -4
  162. package/dist/vtc/groups/show/0.1/payload.js +2 -2
  163. package/dist/vtc/groups/show/0.1/payload.js.map +1 -1
  164. package/dist/vtc/groups/update/0.1/payload.d.ts +4 -4
  165. package/dist/vtc/groups/update/0.1/payload.js +2 -2
  166. package/dist/vtc/groups/update/0.1/payload.js.map +1 -1
  167. package/package.json +1 -1
  168. package/src/_shared/components.ts +331 -17
  169. package/src/device/list/0.2/payload.ts +4 -2
  170. package/src/device/register/0.2/payload.ts +4 -2
  171. package/src/index.ts +24 -0
  172. package/src/voting/_shared/0.1/voting.ts +17 -0
  173. package/src/voting/ballot/cast/0.1/payload.ts +560 -0
  174. package/src/voting/board/consistency/0.1/payload.ts +264 -0
  175. package/src/voting/board/head/0.1/payload.ts +257 -0
  176. package/src/voting/board/inclusion/0.1/payload.ts +300 -0
  177. package/src/voting/board/read/0.1/payload.ts +981 -0
  178. package/src/voting/election/cancel/0.1/payload.ts +368 -0
  179. package/src/voting/election/close/0.1/payload.ts +367 -0
  180. package/src/voting/election/register/0.1/payload.ts +1207 -0
  181. package/src/voting/election/show/0.1/payload.ts +1149 -0
  182. package/src/voting/result/show/0.1/payload.ts +536 -0
  183. package/src/vta/_shared/0.1/app-state-record.ts +1 -1
  184. package/src/vta/_shared/0.4/pcs-engine.ts +1 -1
  185. package/src/vta/app-state/delete/1.0/payload.ts +1 -1
  186. package/src/vta/app-state/get/1.0/payload.ts +1 -1
  187. package/src/vta/app-state/get-many/1.0/payload.ts +1 -1
  188. package/src/vta/app-state/list/1.0/payload.ts +1 -1
  189. package/src/vta/app-state/put/1.0/payload.ts +1 -1
  190. package/src/vta/app-state/put-many/1.0/payload.ts +1 -1
  191. package/src/vta/pcs/applications/create/0.1/payload.ts +1 -1
  192. package/src/vta/pcs/applications/show/0.1/payload.ts +1 -1
  193. package/src/vta/pcs/attest/0.1/payload.ts +1 -1
  194. package/src/vta/pcs/prove/0.1/payload.ts +1 -1
  195. package/src/vta/pcs/root-accept/0.1/payload.ts +1 -1
  196. package/src/vta/pcs/tokens/abandon/0.1/payload.ts +1 -1
  197. package/src/vta/pcs/tokens/accept/0.1/payload.ts +1 -1
  198. package/src/vta/pcs/verify-attestation/0.1/payload.ts +1 -1
  199. package/src/vta/pcs/vetter/show/0.1/payload.ts +1 -1
  200. package/src/vta/pcs/vote/0.1/payload.ts +1365 -0
  201. package/src/vta/pcs/voter/accept/0.1/payload.ts +306 -0
  202. package/src/vta/pcs/voter/receipt/0.1/payload.ts +367 -0
  203. package/src/vta/pcs/voter/register/0.1/payload.ts +1211 -0
  204. package/src/vtc/directory/card/present/0.1/payload.ts +1 -1
  205. package/src/vtc/directory/card/public/0.1/payload.ts +2 -2
  206. package/src/vtc/directory/card/publish/0.1/payload.ts +2 -2
  207. package/src/vtc/elections/cancel/0.1/payload.ts +223 -0
  208. package/src/vtc/elections/certify/0.1/payload.ts +565 -0
  209. package/src/vtc/elections/close/0.1/payload.ts +222 -0
  210. package/src/vtc/elections/create/0.1/payload.ts +1041 -0
  211. package/src/vtc/elections/list/0.1/payload.ts +371 -0
  212. package/src/vtc/elections/show/0.1/payload.ts +1671 -0
  213. package/src/vtc/elections/tickets/issue/0.1/payload.ts +394 -0
  214. package/src/vtc/groups/create/0.1/payload.ts +2 -2
  215. package/src/vtc/groups/list/0.1/payload.ts +2 -2
  216. package/src/vtc/groups/managers/add/0.1/payload.ts +230 -0
  217. package/src/vtc/groups/managers/remove/0.1/payload.ts +230 -0
  218. package/src/vtc/groups/show/0.1/payload.ts +2 -2
  219. package/src/vtc/groups/update/0.1/payload.ts +2 -2
package/CHANGELOG.md CHANGED
@@ -11,6 +11,112 @@ 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.21 — 2026-10-19
15
+
16
+
17
+ ### Added
18
+
19
+ - **voting**: Community voting — voting/* (the ballot box), vtc/elections/* (the registrar) and vta/pcs/voter/* + vta/pcs/vote (the voter's agent) (#834)
20
+
21
+ * feat(voting): community voting — voting/* (the ballot box), vtc/elections/* (the registrar) and vta/pcs/voter/* + vta/pcs/vote (the voter's agent)
22
+
23
+ Twenty-one draft 0.1 tasks for VTI-VOT-001 – 100 (dtgwg-vti-spec, Community
24
+ Voting chapter). A member proves only that they may vote, never who they are,
25
+ and anyone permitted to read the board can recount it.
26
+
27
+ - voting/_shared/0.1: CONVENTIONS.md (separation of registrar and ballot box,
28
+ the exact cryptographic binding — deployment label, ticket class
29
+ voter/<electionId>, hash-to-G1 election point, framed ballot context, cast,
30
+ admission, RFC 9162 board hashing — authorization, VTA custody, privacy,
31
+ shared error local parts, retry safety) and voting.schema.json (Manifest,
32
+ Question, Ballot, Cast, BoardHead, BoardEntry, MerklePath, ElectionResult,
33
+ ElectionSummary, VotingParameters, Disclosure …).
34
+ - voting/*: election/{register,show,close,cancel}, ballot/cast (HTTPS binding
35
+ always accepted, one-time did:key issuer, signed receipt, idempotent),
36
+ board/{head,read,inclusion,consistency}, result/show. 0.1 serves open
37
+ elections only; sealed and tallied-encrypted await the trustee tasks.
38
+ - vtc/elections/*: create (binding elections park for a second
39
+ administrator), list, show (disclosure, kept checkpoints, certified result),
40
+ close, cancel, certify (the VTC verifies the board itself), tickets/issue
41
+ (blind, one per eligible party, recorded before answering).
42
+ - vta/pcs/voter/{register,accept,receipt} and vta/pcs/vote: a voter key per
43
+ election, the blinded ticket request, the signed cast document the client
44
+ sends itself, receipt keeping and inclusion checking. New capability
45
+ `pcsVoter` in device/_shared/0.2 Capability.
46
+
47
+ Bindings regenerated (Rust, TypeScript, Go, Dart); check-bindings agrees and
48
+ the Rust conformance suite passes. Reference implementation of the binding:
49
+ vti-voting in verifiable-trust-infrastructure.
50
+
51
+ - **vtc/groups**: Appointing group managers — vtc/groups/managers/{add,remove}/0.1; create refuses an unserved dynamic group (#833)
52
+
53
+ * feat(vtc/groups): appointing group managers — vtc/groups/managers/{add,remove}/0.1; create refuses an unserved dynamic group
54
+
55
+ The groups family made a manager an access-control resource grant,
56
+ `vtc.groups.manage` qualified `group:<groupId>`, "never this record". But no
57
+ task wrote that grant. The general `acl/grant` caps a grant by the holder's
58
+ role ceiling, so only an administrator could ever manage a group.
59
+
60
+ - vtc/groups/managers/add/0.1: a manager of the group, or a holder of the
61
+ unqualified capability, appoints an active member. The appointment is a
62
+ resource grant on the appointee's entry, delegated by the signer, which sits
63
+ beside the role and never inside its ceiling, so a member with no
64
+ administrative role may hold it. The signer must cover the grant. It is
65
+ reviewed like any delegated grant when its granter departs, and withdrawn
66
+ with the group or the holder's departure. The group's record never decides
67
+ who manages it. Codes: notFound, entryNotFound, alreadyManager.
68
+ - vtc/groups/managers/remove/0.1: a manager steps down, or a holder of the
69
+ unqualified capability removes another manager's appointment. Managers of
70
+ one group do not remove one another. Codes: notFound, notManager.
71
+ - vtc/groups/create: `kindNotServed` lets a community that serves only static
72
+ groups refuse a dynamic one after checking its rule. It never stores a
73
+ dynamic group it does not compute.
74
+ - group.schema.json: `managers` points at the new task.
75
+
76
+
77
+
78
+ ### Fixed
79
+
80
+ - **device**: PcsVoter is appended to Capability, not inserted — no existing variant moves (#835)
81
+ - **vtc/directory/card/present**: A Data Integrity presentation binds through its signed nonce and domain (#831)
82
+
83
+ Producer conformance required a Data Integrity presentation's proof to carry `challenge` equal to the document's `id` and `domain` equal to the community's DID. Neither member is signed by the Data Integrity libraries the implementations use: a proof stating them either fails to verify or carries them unsigned, where they bind nothing. The presentations this ecosystem already produces for a verifier (`vta_sdk::vp::build_di_vp`, the OpenID4VP DI path, the personhood assertion) put `nonce` and `domain` on the presentation itself, which the holder's proof covers.
84
+
85
+ The binding is now the presentation's own `nonce` (this document's `id`) and `domain` (the community's DID), signed by the holder proof; a proof that also states `challenge` or `domain` must state the same values. The consumer's item 3 is unchanged: it verifies "the binding above".
86
+
87
+ No schema change beyond the presentation's description; the generated libraries carry the new text in their documentation.
88
+
89
+ ## 0.26.20 — 2026-10-19
90
+
91
+
92
+ ### Fixed
93
+
94
+ - **vtc/directory/images/upload**: TooLarge also refuses a picture beyond the decoding bound (#829)
95
+
96
+ images/upload declared `tooLarge` for `data` that decodes to more than 262144 bytes, and item 2 refuses it before decoding. But the payload schema already bounds `data` to exactly 262144 bytes, so a conforming community could never send the code. The schema answers malformedRequest first.
97
+
98
+ The bound that matters is the other one. A PNG of a few kilobytes can claim tens of thousands of pixels across, which is a decompression bomb, and nothing in the specification told a community to stop it. Item 2 now requires a community to bound what it decodes, the pixels a picture may claim and the memory its decoding may take, and to refuse a picture beyond either with `tooLarge`. The code's meaning says the same.
99
+
100
+ No schema change; the generated Rust carries the new meaning in its documentation.
101
+
102
+ - **vtc/directory/card/publish**: The card names its signer as issuer, so an agent-held key can sign it (#830)
103
+
104
+ card/publish allowed a card no members but `@type`, `version`, `uid`, `kind`, `updated` and `proof` besides its values. That left a member whose key their agent holds, the usual case, with no way to sign it: keys/sign-document signs a document only as the DID it names in `issuer` or `controller`, and the card could name neither.
105
+
106
+ The card now carries `issuer`, the membership DID, as a required member that carries no directory value. Item 4 checks it is the member's DID. The mapping section says why it is there, and a card/public reader checks it names the DID that signed. It adds no identifier: the proof's verificationMethod already names the DID, and the recognition record the card hangs from names it too. The correlation paragraph is corrected to say so.
107
+
108
+ The examples gain `issuer`, and their cardDigest is recomputed (zQmcjRKZd1TExLaEuMVv5xe2tTx4a1YkRQ58zwVrnByxYS4). The PublishedCard description in the shared schema lists `issuer` among the members a consumer checks; the bindings are regenerated for that description.
109
+
110
+ - **vtc/directory/card/publish**: Pin the JSContact mapping, and withdraw without waiting on the registry (#827)
111
+
112
+ card/publish item 4 compares a member's card with their public values "mapped as JSContactCard maps them", but JSContactCard names only where each base field lands, not its shape: not the map identifiers, not how a link list is laid out, and not what the avatar's `uri` is. Two conforming wallets could sign different bytes for the same values, and a community could not tell which was right.
113
+
114
+ *Mapping the public values* fixes it: one JSContact member per field, fixed map identifiers (k1, m1, p1, n1, l1…), the avatar as `media.m1` with `uri` `urn:vtc-directory:<entryId>:avatar:<sha256>` (what a reader sends to images/get), and every other field as a member named by its key. Item 4 now compares against that table, and lists `proof` among the members that carry no directory value.
115
+
116
+ Item 9 said to remove the registry pointer first, then stop serving the card. That kept a card the member had withdrawn on public view until the registry answered, which can be an hour when it is down. A withdrawal now stops serving and erases the card at once and removes the pointer, retried until it lands. A pointer read in the meantime names a card card/public answers notFound, which tells the reader nothing. card/update item 7 and the retention note follow.
117
+
118
+ Prose only: no schema or generated binding changes.
119
+
14
120
  ## 0.26.19 — 2026-10-19
15
121
 
16
122