@openvtc/trust-tasks 0.19.12 → 0.19.14

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 (73) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/_shared/components.d.ts +41 -0
  3. package/dist/_shared/components.d.ts.map +1 -1
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +1 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/persona/_shared/0.1/persona-record.d.ts +1 -1
  9. package/dist/persona/_shared/0.1/persona-record.d.ts.map +1 -1
  10. package/dist/persona/attribute/list/1.0/payload.d.ts +140 -24
  11. package/dist/persona/attribute/list/1.0/payload.d.ts.map +1 -1
  12. package/dist/persona/attribute/list/1.0/payload.js +76 -12
  13. package/dist/persona/attribute/list/1.0/payload.js.map +1 -1
  14. package/dist/persona/attribute/purge-version/1.0/payload.d.ts +413 -0
  15. package/dist/persona/attribute/purge-version/1.0/payload.d.ts.map +1 -0
  16. package/dist/persona/attribute/purge-version/1.0/payload.js +223 -0
  17. package/dist/persona/attribute/purge-version/1.0/payload.js.map +1 -0
  18. package/dist/persona/attribute/put/1.0/payload.d.ts +183 -0
  19. package/dist/persona/attribute/put/1.0/payload.d.ts.map +1 -1
  20. package/dist/persona/attribute/put/1.0/payload.js +96 -0
  21. package/dist/persona/attribute/put/1.0/payload.js.map +1 -1
  22. package/dist/persona/binding/get/1.0/payload.d.ts +33 -5
  23. package/dist/persona/binding/get/1.0/payload.d.ts.map +1 -1
  24. package/dist/persona/binding/get/1.0/payload.js +14 -2
  25. package/dist/persona/binding/get/1.0/payload.js.map +1 -1
  26. package/dist/persona/binding/list/1.0/payload.d.ts +33 -5
  27. package/dist/persona/binding/list/1.0/payload.d.ts.map +1 -1
  28. package/dist/persona/binding/list/1.0/payload.js +14 -2
  29. package/dist/persona/binding/list/1.0/payload.js.map +1 -1
  30. package/dist/persona/binding/set/1.0/payload.d.ts +16 -0
  31. package/dist/persona/binding/set/1.0/payload.d.ts.map +1 -1
  32. package/dist/persona/binding/set/1.0/payload.js +6 -0
  33. package/dist/persona/binding/set/1.0/payload.js.map +1 -1
  34. package/dist/persona/disclosure/history/1.0/payload.d.ts +42 -0
  35. package/dist/persona/disclosure/history/1.0/payload.d.ts.map +1 -1
  36. package/dist/persona/disclosure/history/1.0/payload.js +28 -0
  37. package/dist/persona/disclosure/history/1.0/payload.js.map +1 -1
  38. package/dist/persona/local/binding/set/1.0/payload.d.ts +16 -0
  39. package/dist/persona/local/binding/set/1.0/payload.d.ts.map +1 -1
  40. package/dist/persona/local/binding/set/1.0/payload.js +6 -0
  41. package/dist/persona/local/binding/set/1.0/payload.js.map +1 -1
  42. package/dist/persona/local/profile/put/1.0/payload.d.ts +33 -2
  43. package/dist/persona/local/profile/put/1.0/payload.d.ts.map +1 -1
  44. package/dist/persona/local/profile/put/1.0/payload.js +15 -0
  45. package/dist/persona/local/profile/put/1.0/payload.js.map +1 -1
  46. package/dist/persona/profile/get/1.0/payload.d.ts +94 -6
  47. package/dist/persona/profile/get/1.0/payload.d.ts.map +1 -1
  48. package/dist/persona/profile/get/1.0/payload.js +46 -2
  49. package/dist/persona/profile/get/1.0/payload.js.map +1 -1
  50. package/dist/persona/profile/list/1.0/payload.d.ts +78 -6
  51. package/dist/persona/profile/list/1.0/payload.d.ts.map +1 -1
  52. package/dist/persona/profile/list/1.0/payload.js +38 -2
  53. package/dist/persona/profile/list/1.0/payload.js.map +1 -1
  54. package/dist/persona/profile/put/1.0/payload.d.ts +78 -6
  55. package/dist/persona/profile/put/1.0/payload.d.ts.map +1 -1
  56. package/dist/persona/profile/put/1.0/payload.js +38 -2
  57. package/dist/persona/profile/put/1.0/payload.js.map +1 -1
  58. package/package.json +1 -1
  59. package/src/_shared/components.ts +41 -0
  60. package/src/index.ts +1 -0
  61. package/src/persona/_shared/0.1/persona-record.ts +1 -1
  62. package/src/persona/attribute/list/1.0/payload.ts +76 -12
  63. package/src/persona/attribute/purge-version/1.0/payload.ts +277 -0
  64. package/src/persona/attribute/put/1.0/payload.ts +115 -0
  65. package/src/persona/binding/get/1.0/payload.ts +19 -3
  66. package/src/persona/binding/list/1.0/payload.ts +19 -3
  67. package/src/persona/binding/set/1.0/payload.ts +10 -0
  68. package/src/persona/disclosure/history/1.0/payload.ts +34 -0
  69. package/src/persona/local/binding/set/1.0/payload.ts +10 -0
  70. package/src/persona/local/profile/put/1.0/payload.ts +18 -2
  71. package/src/persona/profile/get/1.0/payload.ts +48 -4
  72. package/src/persona/profile/list/1.0/payload.ts +40 -4
  73. package/src/persona/profile/put/1.0/payload.ts +40 -4
@@ -223,6 +223,38 @@ export const PAYLOAD_SCHEMA = {
223
223
  "version": {
224
224
  "$ref": "#/$defs/Version"
225
225
  },
226
+ "retainedVersions": {
227
+ "type": "array",
228
+ "maxItems": 64,
229
+ "description": "Earlier versions of this attribute the maintainer still holds, and why. A maintainer that keeps a replaced value to serve `pinVersion` MUST list it here: a holder who overwrote a value may reasonably believe it gone, and this is how they learn otherwise. Values are not included — the holder reads one through the profile that pins it, or removes it with persona/attribute/purge-version. Absent when none are held.",
230
+ "items": {
231
+ "type": "object",
232
+ "additionalProperties": false,
233
+ "required": [
234
+ "version",
235
+ "pinnedBy"
236
+ ],
237
+ "properties": {
238
+ "version": {
239
+ "$ref": "#/$defs/Version"
240
+ },
241
+ "updatedAt": {
242
+ "type": "string",
243
+ "format": "date-time",
244
+ "description": "When this version was written."
245
+ },
246
+ "pinnedBy": {
247
+ "type": "array",
248
+ "minItems": 1,
249
+ "maxItems": 256,
250
+ "items": {
251
+ "$ref": "#/$defs/Ulid"
252
+ },
253
+ "description": "The profiles pinning this version — the reason it is kept. A version no profile pins is not retained."
254
+ }
255
+ }
256
+ }
257
+ },
226
258
  "createdAt": {
227
259
  "type": "string",
228
260
  "format": "date-time"
@@ -233,6 +265,12 @@ export const PAYLOAD_SCHEMA = {
233
265
  }
234
266
  }
235
267
  },
268
+ "Ulid": {
269
+ "title": "Ulid",
270
+ "description": "A ULID in Crockford base32, uppercase. Used for `attributeId` and `profileId`. Chosen over a UUID because the leading 48 bits are a timestamp, so a key-ordered scan of the store is also creation-ordered and a `list` needs no secondary sort. Server-assigned on create; a producer MAY supply one to make a create idempotent, and a maintainer MUST reject a supplied value that already exists rather than silently overwriting.",
271
+ "type": "string",
272
+ "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$"
273
+ },
236
274
  "Version": {
237
275
  "title": "Version",
238
276
  "description": "A value of the store's monotonic write counter. Server-assigned; a producer never chooses one.",
@@ -363,12 +401,6 @@ export const PAYLOAD_SCHEMA = {
363
401
  "minLength": 1,
364
402
  "maxLength": 128,
365
403
  "pattern": "^(x:)?[a-z][a-zA-Z0-9]*(\\.[a-z][a-zA-Z0-9]*)*$"
366
- },
367
- "Ulid": {
368
- "title": "Ulid",
369
- "description": "A ULID in Crockford base32, uppercase. Used for `attributeId` and `profileId`. Chosen over a UUID because the leading 48 bits are a timestamp, so a key-ordered scan of the store is also creation-ordered and a `list` needs no secondary sort. Server-assigned on create; a producer MAY supply one to make a create idempotent, and a maintainer MUST reject a supplied value that already exists rather than silently overwriting.",
370
- "type": "string",
371
- "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$"
372
404
  }
373
405
  }
374
406
  } as const;
@@ -475,6 +507,38 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
475
507
  "version": {
476
508
  "$ref": "#/$defs/Version"
477
509
  },
510
+ "retainedVersions": {
511
+ "type": "array",
512
+ "maxItems": 64,
513
+ "description": "Earlier versions of this attribute the maintainer still holds, and why. A maintainer that keeps a replaced value to serve `pinVersion` MUST list it here: a holder who overwrote a value may reasonably believe it gone, and this is how they learn otherwise. Values are not included — the holder reads one through the profile that pins it, or removes it with persona/attribute/purge-version. Absent when none are held.",
514
+ "items": {
515
+ "type": "object",
516
+ "additionalProperties": false,
517
+ "required": [
518
+ "version",
519
+ "pinnedBy"
520
+ ],
521
+ "properties": {
522
+ "version": {
523
+ "$ref": "#/$defs/Version"
524
+ },
525
+ "updatedAt": {
526
+ "type": "string",
527
+ "format": "date-time",
528
+ "description": "When this version was written."
529
+ },
530
+ "pinnedBy": {
531
+ "type": "array",
532
+ "minItems": 1,
533
+ "maxItems": 256,
534
+ "items": {
535
+ "$ref": "#/$defs/Ulid"
536
+ },
537
+ "description": "The profiles pinning this version — the reason it is kept. A version no profile pins is not retained."
538
+ }
539
+ }
540
+ }
541
+ },
478
542
  "createdAt": {
479
543
  "type": "string",
480
544
  "format": "date-time"
@@ -485,6 +549,12 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
485
549
  }
486
550
  }
487
551
  },
552
+ "Ulid": {
553
+ "title": "Ulid",
554
+ "description": "A ULID in Crockford base32, uppercase. Used for `attributeId` and `profileId`. Chosen over a UUID because the leading 48 bits are a timestamp, so a key-ordered scan of the store is also creation-ordered and a `list` needs no secondary sort. Server-assigned on create; a producer MAY supply one to make a create idempotent, and a maintainer MUST reject a supplied value that already exists rather than silently overwriting.",
555
+ "type": "string",
556
+ "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$"
557
+ },
488
558
  "Version": {
489
559
  "title": "Version",
490
560
  "description": "A value of the store's monotonic write counter. Server-assigned; a producer never chooses one.",
@@ -615,12 +685,6 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
615
685
  "minLength": 1,
616
686
  "maxLength": 128,
617
687
  "pattern": "^(x:)?[a-z][a-zA-Z0-9]*(\\.[a-z][a-zA-Z0-9]*)*$"
618
- },
619
- "Ulid": {
620
- "title": "Ulid",
621
- "description": "A ULID in Crockford base32, uppercase. Used for `attributeId` and `profileId`. Chosen over a UUID because the leading 48 bits are a timestamp, so a key-ordered scan of the store is also creation-ordered and a `list` needs no secondary sort. Server-assigned on create; a producer MAY supply one to make a create idempotent, and a maintainer MUST reject a supplied value that already exists rather than silently overwriting.",
622
- "type": "string",
623
- "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$"
624
688
  }
625
689
  }
626
690
  } as const;
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Generated by scripts/build-ts-bindings.mjs — DO NOT EDIT BY HAND.
3
+ * Source: specs/persona/attribute/purge-version/1.0/payload.schema.json
4
+ */
5
+
6
+ import type { Ext, Ulid, Version_PersonaV0_1 as Version } from "../../../../_shared/components.js";
7
+
8
+
9
+ /**
10
+ * Permanently remove earlier versions of one attribute that the maintainer kept because a profile pins them. The holder's override on retention: after a name change, the old name is kept only while something needs it, and this is how the holder says nothing does.
11
+ */
12
+ export interface PersonaAttributePurgeVersionPayload {
13
+ attributeId: Ulid;
14
+ /**
15
+ * The retained versions to remove. Omit to remove every retained version of the attribute. The current version is never removed by this task — that is persona/attribute/delete.
16
+ *
17
+ * @minItems 1
18
+ * @maxItems 64
19
+ */
20
+ versions?: [Version, ...Version[]];
21
+ ext?: Ext;
22
+ }
23
+ /**
24
+ * Success response to persona/attribute/purge-version. Type https://trusttasks.org/spec/persona/attribute/purge-version/1.0#response. Purging a version that is not held is a success that purges nothing, so a repeated purge converges.
25
+ */
26
+ export interface PersonaAttributePurgeVersionResponsePayload {
27
+ attributeId: Ulid;
28
+ /**
29
+ * The versions actually removed. Empty when none named was held.
30
+ *
31
+ * @maxItems 64
32
+ */
33
+ purged: Version[];
34
+ /**
35
+ * Profiles that pinned a purged version and now present that entry as stale — which is to say, disclose nothing for it until the holder repins or edits them. Named because a purge that quietly shortened what three faces present is the surprise this family exists to prevent. Absent when none did.
36
+ *
37
+ * @maxItems 256
38
+ */
39
+ stalePins?: {
40
+ profileId: Ulid;
41
+ pinVersion: Version;
42
+ }[];
43
+ ext?: Ext;
44
+ }
45
+
46
+ /** Shared definitions this specification references, re-exported under the names it used to declare them with. */
47
+ export type { Ext, Ulid, Version };
48
+
49
+ /** Trust Task type URI. */
50
+ export const TYPE_URI = "https://trusttasks.org/spec/persona/attribute/purge-version/1.0" as const;
51
+
52
+ /** Stable alias for this specification's request payload shape. */
53
+ export type Payload = PersonaAttributePurgeVersionPayload;
54
+
55
+ /** Trust Task response type URI (request type URI + "#response"). */
56
+ export const RESPONSE_TYPE_URI = "https://trusttasks.org/spec/persona/attribute/purge-version/1.0#response" as const;
57
+
58
+ /** Stable alias for this specification's success-response payload shape. */
59
+ export type Response = PersonaAttributePurgeVersionResponsePayload;
60
+
61
+ /**
62
+ * This specification's payload schema, as a value.
63
+ *
64
+ * SPEC.md §7.2 item 2 is performed against this. It is shipped as data
65
+ * rather than only as a `.json` file because TypeScript types are erased
66
+ * at runtime: without a schema a consumer has nothing to validate, and
67
+ * every REQUIRED payload member is optional in practice. Cross-file
68
+ * `$ref`s are already inlined, so it needs no resolver.
69
+ */
70
+ export const PAYLOAD_SCHEMA = {
71
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
72
+ "$id": "https://trusttasks.org/spec/persona/attribute/purge-version/1.0",
73
+ "title": "Persona Attribute Purge Version — payload",
74
+ "description": "Permanently remove earlier versions of one attribute that the maintainer kept because a profile pins them. The holder's override on retention: after a name change, the old name is kept only while something needs it, and this is how the holder says nothing does.",
75
+ "type": "object",
76
+ "additionalProperties": false,
77
+ "required": [
78
+ "attributeId"
79
+ ],
80
+ "properties": {
81
+ "attributeId": {
82
+ "$ref": "#/$defs/Ulid"
83
+ },
84
+ "versions": {
85
+ "type": "array",
86
+ "minItems": 1,
87
+ "maxItems": 64,
88
+ "uniqueItems": true,
89
+ "items": {
90
+ "$ref": "#/$defs/Version"
91
+ },
92
+ "description": "The retained versions to remove. Omit to remove every retained version of the attribute. The current version is never removed by this task — that is persona/attribute/delete."
93
+ },
94
+ "ext": {
95
+ "$ref": "#/$defs/Ext"
96
+ }
97
+ },
98
+ "$defs": {
99
+ "Response": {
100
+ "$anchor": "response",
101
+ "title": "Persona Attribute Purge Version — response payload",
102
+ "description": "Success response to persona/attribute/purge-version. Type https://trusttasks.org/spec/persona/attribute/purge-version/1.0#response. Purging a version that is not held is a success that purges nothing, so a repeated purge converges.",
103
+ "type": "object",
104
+ "additionalProperties": false,
105
+ "required": [
106
+ "attributeId",
107
+ "purged"
108
+ ],
109
+ "properties": {
110
+ "attributeId": {
111
+ "$ref": "#/$defs/Ulid"
112
+ },
113
+ "purged": {
114
+ "type": "array",
115
+ "maxItems": 64,
116
+ "items": {
117
+ "$ref": "#/$defs/Version"
118
+ },
119
+ "description": "The versions actually removed. Empty when none named was held."
120
+ },
121
+ "stalePins": {
122
+ "type": "array",
123
+ "maxItems": 256,
124
+ "description": "Profiles that pinned a purged version and now present that entry as stale — which is to say, disclose nothing for it until the holder repins or edits them. Named because a purge that quietly shortened what three faces present is the surprise this family exists to prevent. Absent when none did.",
125
+ "items": {
126
+ "type": "object",
127
+ "additionalProperties": false,
128
+ "required": [
129
+ "profileId",
130
+ "pinVersion"
131
+ ],
132
+ "properties": {
133
+ "profileId": {
134
+ "$ref": "#/$defs/Ulid"
135
+ },
136
+ "pinVersion": {
137
+ "$ref": "#/$defs/Version"
138
+ }
139
+ }
140
+ }
141
+ },
142
+ "ext": {
143
+ "$ref": "#/$defs/Ext"
144
+ }
145
+ }
146
+ },
147
+ "Ext": {
148
+ "title": "Ext",
149
+ "description": "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.",
150
+ "type": "object",
151
+ "minProperties": 1,
152
+ "additionalProperties": true,
153
+ "propertyNames": {
154
+ "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
155
+ }
156
+ },
157
+ "Version": {
158
+ "title": "Version",
159
+ "description": "A value of the store's monotonic write counter. Server-assigned; a producer never chooses one.",
160
+ "type": "integer",
161
+ "minimum": 1
162
+ },
163
+ "Ulid": {
164
+ "title": "Ulid",
165
+ "description": "A ULID in Crockford base32, uppercase. Used for `attributeId` and `profileId`. Chosen over a UUID because the leading 48 bits are a timestamp, so a key-ordered scan of the store is also creation-ordered and a `list` needs no secondary sort. Server-assigned on create; a producer MAY supply one to make a create idempotent, and a maintainer MUST reject a supplied value that already exists rather than silently overwriting.",
166
+ "type": "string",
167
+ "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$"
168
+ }
169
+ }
170
+ } as const;
171
+
172
+ /** As {@link PAYLOAD_SCHEMA}, for the success-response variant. */
173
+ export const RESPONSE_PAYLOAD_SCHEMA = {
174
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
175
+ "$ref": "#/$defs/Response",
176
+ "$defs": {
177
+ "Response": {
178
+ "$anchor": "response",
179
+ "title": "Persona Attribute Purge Version — response payload",
180
+ "description": "Success response to persona/attribute/purge-version. Type https://trusttasks.org/spec/persona/attribute/purge-version/1.0#response. Purging a version that is not held is a success that purges nothing, so a repeated purge converges.",
181
+ "type": "object",
182
+ "additionalProperties": false,
183
+ "required": [
184
+ "attributeId",
185
+ "purged"
186
+ ],
187
+ "properties": {
188
+ "attributeId": {
189
+ "$ref": "#/$defs/Ulid"
190
+ },
191
+ "purged": {
192
+ "type": "array",
193
+ "maxItems": 64,
194
+ "items": {
195
+ "$ref": "#/$defs/Version"
196
+ },
197
+ "description": "The versions actually removed. Empty when none named was held."
198
+ },
199
+ "stalePins": {
200
+ "type": "array",
201
+ "maxItems": 256,
202
+ "description": "Profiles that pinned a purged version and now present that entry as stale — which is to say, disclose nothing for it until the holder repins or edits them. Named because a purge that quietly shortened what three faces present is the surprise this family exists to prevent. Absent when none did.",
203
+ "items": {
204
+ "type": "object",
205
+ "additionalProperties": false,
206
+ "required": [
207
+ "profileId",
208
+ "pinVersion"
209
+ ],
210
+ "properties": {
211
+ "profileId": {
212
+ "$ref": "#/$defs/Ulid"
213
+ },
214
+ "pinVersion": {
215
+ "$ref": "#/$defs/Version"
216
+ }
217
+ }
218
+ }
219
+ },
220
+ "ext": {
221
+ "$ref": "#/$defs/Ext"
222
+ }
223
+ }
224
+ },
225
+ "Ext": {
226
+ "title": "Ext",
227
+ "description": "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.",
228
+ "type": "object",
229
+ "minProperties": 1,
230
+ "additionalProperties": true,
231
+ "propertyNames": {
232
+ "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
233
+ }
234
+ },
235
+ "Version": {
236
+ "title": "Version",
237
+ "description": "A value of the store's monotonic write counter. Server-assigned; a producer never chooses one.",
238
+ "type": "integer",
239
+ "minimum": 1
240
+ },
241
+ "Ulid": {
242
+ "title": "Ulid",
243
+ "description": "A ULID in Crockford base32, uppercase. Used for `attributeId` and `profileId`. Chosen over a UUID because the leading 48 bits are a timestamp, so a key-ordered scan of the store is also creation-ordered and a `list` needs no secondary sort. Server-assigned on create; a producer MAY supply one to make a create idempotent, and a maintainer MUST reject a supplied value that already exists rather than silently overwriting.",
244
+ "type": "string",
245
+ "pattern": "^[0-9A-HJKMNP-TV-Z]{26}$"
246
+ }
247
+ }
248
+ } as const;
249
+
250
+ /**
251
+ * SPEC.md §7.2 policy for the request variant, from this specification's
252
+ * front matter. Pass to `consumeInbound` — items 5b, 7 and 8 are
253
+ * per-specification and cannot be derived from the document alone, and
254
+ * item 2 needs the schema this carries.
255
+ */
256
+ export const SPEC = {
257
+ typeUri: TYPE_URI,
258
+ isBearer: false,
259
+ isProofRequired: true,
260
+ isRecipientRequired: true,
261
+ isIssuedAtRequired: true,
262
+ payloadSchema: PAYLOAD_SCHEMA,
263
+ } as const;
264
+
265
+ /**
266
+ * SPEC.md §7.2 policy for the success-response variant. `isRecipientRequired`
267
+ * tracks the *issuer* party's requirement because a response swaps the
268
+ * parties (§7.3 item 5).
269
+ */
270
+ export const RESPONSE_SPEC = {
271
+ typeUri: RESPONSE_TYPE_URI,
272
+ isBearer: false,
273
+ isProofRequired: true,
274
+ isRecipientRequired: true,
275
+ isIssuedAtRequired: true,
276
+ payloadSchema: RESPONSE_PAYLOAD_SCHEMA,
277
+ } as const;
@@ -64,6 +64,25 @@ export interface PersonaAttributePutResponsePayload {
64
64
  */
65
65
  sharedWithProfileCount?: number;
66
66
  };
67
+ /**
68
+ * Every place this write changed what a persona presents: each binding whose projection was re-pushed because a face wearing it shows this attribute live. An edit propagates by design, and a holder told only that it saved cannot tell whether it refreshed one face or nine. Holder-authorized, so identifiers are returned. Absent when nothing was bound to a face showing it.
69
+ *
70
+ * @maxItems 256
71
+ */
72
+ refreshed?: {
73
+ profileId: Ulid;
74
+ contextId: string;
75
+ personaDid: string;
76
+ }[];
77
+ /**
78
+ * Faces that pin this attribute to an earlier version and so did NOT follow the edit — the counterparties that must keep seeing the value they verified. Named so the holder can decide, per face, whether that is still what they want. Absent when no face pins it.
79
+ *
80
+ * @maxItems 256
81
+ */
82
+ heldByPin?: {
83
+ profileId: Ulid;
84
+ pinVersion: Version;
85
+ }[];
67
86
  createdAt?: string;
68
87
  updatedAt: string;
69
88
  ext?: Ext;
@@ -192,6 +211,54 @@ export const PAYLOAD_SCHEMA = {
192
211
  }
193
212
  }
194
213
  },
214
+ "refreshed": {
215
+ "type": "array",
216
+ "maxItems": 256,
217
+ "description": "Every place this write changed what a persona presents: each binding whose projection was re-pushed because a face wearing it shows this attribute live. An edit propagates by design, and a holder told only that it saved cannot tell whether it refreshed one face or nine. Holder-authorized, so identifiers are returned. Absent when nothing was bound to a face showing it.",
218
+ "items": {
219
+ "type": "object",
220
+ "additionalProperties": false,
221
+ "required": [
222
+ "profileId",
223
+ "contextId",
224
+ "personaDid"
225
+ ],
226
+ "properties": {
227
+ "profileId": {
228
+ "$ref": "#/$defs/Ulid"
229
+ },
230
+ "contextId": {
231
+ "type": "string",
232
+ "minLength": 1
233
+ },
234
+ "personaDid": {
235
+ "type": "string",
236
+ "minLength": 1
237
+ }
238
+ }
239
+ }
240
+ },
241
+ "heldByPin": {
242
+ "type": "array",
243
+ "maxItems": 256,
244
+ "description": "Faces that pin this attribute to an earlier version and so did NOT follow the edit — the counterparties that must keep seeing the value they verified. Named so the holder can decide, per face, whether that is still what they want. Absent when no face pins it.",
245
+ "items": {
246
+ "type": "object",
247
+ "additionalProperties": false,
248
+ "required": [
249
+ "profileId",
250
+ "pinVersion"
251
+ ],
252
+ "properties": {
253
+ "profileId": {
254
+ "$ref": "#/$defs/Ulid"
255
+ },
256
+ "pinVersion": {
257
+ "$ref": "#/$defs/Version"
258
+ }
259
+ }
260
+ }
261
+ },
195
262
  "createdAt": {
196
263
  "type": "string",
197
264
  "format": "date-time"
@@ -412,6 +479,54 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
412
479
  }
413
480
  }
414
481
  },
482
+ "refreshed": {
483
+ "type": "array",
484
+ "maxItems": 256,
485
+ "description": "Every place this write changed what a persona presents: each binding whose projection was re-pushed because a face wearing it shows this attribute live. An edit propagates by design, and a holder told only that it saved cannot tell whether it refreshed one face or nine. Holder-authorized, so identifiers are returned. Absent when nothing was bound to a face showing it.",
486
+ "items": {
487
+ "type": "object",
488
+ "additionalProperties": false,
489
+ "required": [
490
+ "profileId",
491
+ "contextId",
492
+ "personaDid"
493
+ ],
494
+ "properties": {
495
+ "profileId": {
496
+ "$ref": "#/$defs/Ulid"
497
+ },
498
+ "contextId": {
499
+ "type": "string",
500
+ "minLength": 1
501
+ },
502
+ "personaDid": {
503
+ "type": "string",
504
+ "minLength": 1
505
+ }
506
+ }
507
+ }
508
+ },
509
+ "heldByPin": {
510
+ "type": "array",
511
+ "maxItems": 256,
512
+ "description": "Faces that pin this attribute to an earlier version and so did NOT follow the edit — the counterparties that must keep seeing the value they verified. Named so the holder can decide, per face, whether that is still what they want. Absent when no face pins it.",
513
+ "items": {
514
+ "type": "object",
515
+ "additionalProperties": false,
516
+ "required": [
517
+ "profileId",
518
+ "pinVersion"
519
+ ],
520
+ "properties": {
521
+ "profileId": {
522
+ "$ref": "#/$defs/Ulid"
523
+ },
524
+ "pinVersion": {
525
+ "$ref": "#/$defs/Version"
526
+ }
527
+ }
528
+ }
529
+ },
415
530
  "createdAt": {
416
531
  "type": "string",
417
532
  "format": "date-time"
@@ -29,7 +29,11 @@ export interface PersonaBindingGetResponsePayload {
29
29
  */
30
30
  profileId?: Ulid;
31
31
  /**
32
- * The holder's label for the bound profile, so an application can show which identity is in use. Names a composition; reveals none of it.
32
+ * The name the holder chose for this context to call the face (persona/binding/set `label`). Absent when they chose none.
33
+ */
34
+ label?: string;
35
+ /**
36
+ * The holder's OWN name for the bound face. A maintainer MUST omit it unless the caller is holder-authorized: it is the holder's filing, not something they told this context, and it can say far more than the face shows. A context-scoped caller reads `label`.
33
37
  */
34
38
  profileName?: string;
35
39
  /**
@@ -118,10 +122,16 @@ export const PAYLOAD_SCHEMA = {
118
122
  "$ref": "#/$defs/Ulid",
119
123
  "description": "Present when bound. An identifier only; a context-scoped caller cannot resolve it, because profile reads are holder-authorized."
120
124
  },
125
+ "label": {
126
+ "type": "string",
127
+ "minLength": 1,
128
+ "maxLength": 128,
129
+ "description": "The name the holder chose for this context to call the face (persona/binding/set `label`). Absent when they chose none."
130
+ },
121
131
  "profileName": {
122
132
  "type": "string",
123
133
  "maxLength": 128,
124
- "description": "The holder's label for the bound profile, so an application can show which identity is in use. Names a composition; reveals none of it."
134
+ "description": "The holder's OWN name for the bound face. A maintainer MUST omit it unless the caller is holder-authorized: it is the holder's filing, not something they told this context, and it can say far more than the face shows. A context-scoped caller reads `label`."
125
135
  },
126
136
  "claimCount": {
127
137
  "type": "integer",
@@ -189,10 +199,16 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
189
199
  "$ref": "#/$defs/Ulid",
190
200
  "description": "Present when bound. An identifier only; a context-scoped caller cannot resolve it, because profile reads are holder-authorized."
191
201
  },
202
+ "label": {
203
+ "type": "string",
204
+ "minLength": 1,
205
+ "maxLength": 128,
206
+ "description": "The name the holder chose for this context to call the face (persona/binding/set `label`). Absent when they chose none."
207
+ },
192
208
  "profileName": {
193
209
  "type": "string",
194
210
  "maxLength": 128,
195
- "description": "The holder's label for the bound profile, so an application can show which identity is in use. Names a composition; reveals none of it."
211
+ "description": "The holder's OWN name for the bound face. A maintainer MUST omit it unless the caller is holder-authorized: it is the holder's filing, not something they told this context, and it can say far more than the face shows. A context-scoped caller reads `label`."
196
212
  },
197
213
  "claimCount": {
198
214
  "type": "integer",
@@ -26,7 +26,11 @@ export interface PersonaBindingListResponsePayload {
26
26
  personaDid: string;
27
27
  bound: boolean;
28
28
  /**
29
- * The holder's label for the bound profile. Names a composition; reveals none of it.
29
+ * The name the holder chose for this context to call the face. Absent when they chose none.
30
+ */
31
+ label?: string;
32
+ /**
33
+ * The holder's OWN name for the bound face. A maintainer MUST omit it unless the caller is holder-authorized; see persona/binding/get.
30
34
  */
31
35
  profileName?: string;
32
36
  claimCount?: number;
@@ -121,10 +125,16 @@ export const PAYLOAD_SCHEMA = {
121
125
  "bound": {
122
126
  "type": "boolean"
123
127
  },
128
+ "label": {
129
+ "type": "string",
130
+ "minLength": 1,
131
+ "maxLength": 128,
132
+ "description": "The name the holder chose for this context to call the face. Absent when they chose none."
133
+ },
124
134
  "profileName": {
125
135
  "type": "string",
126
136
  "maxLength": 128,
127
- "description": "The holder's label for the bound profile. Names a composition; reveals none of it."
137
+ "description": "The holder's OWN name for the bound face. A maintainer MUST omit it unless the caller is holder-authorized; see persona/binding/get."
128
138
  },
129
139
  "claimCount": {
130
140
  "type": "integer",
@@ -192,10 +202,16 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
192
202
  "bound": {
193
203
  "type": "boolean"
194
204
  },
205
+ "label": {
206
+ "type": "string",
207
+ "minLength": 1,
208
+ "maxLength": 128,
209
+ "description": "The name the holder chose for this context to call the face. Absent when they chose none."
210
+ },
195
211
  "profileName": {
196
212
  "type": "string",
197
213
  "maxLength": 128,
198
- "description": "The holder's label for the bound profile. Names a composition; reveals none of it."
214
+ "description": "The holder's OWN name for the bound face. A maintainer MUST omit it unless the caller is holder-authorized; see persona/binding/get."
199
215
  },
200
216
  "claimCount": {
201
217
  "type": "integer",
@@ -28,6 +28,10 @@ export interface PersonaBindingSetPayload {
28
28
  * @maxItems 32
29
29
  */
30
30
  publicEntries?: Ulid[];
31
+ /**
32
+ * What this context may call the face the persona wears here, chosen by the holder for this context. Returned by persona/binding/get and persona/binding/list in place of the holder's own name for the face, which is theirs and may say far more than they would tell a context ('the divorce'). Omit to give the context no name at all.
33
+ */
34
+ label?: string;
31
35
  expectedVersion?: ExpectedVersion;
32
36
  ext?: Ext;
33
37
  }
@@ -123,6 +127,12 @@ export const PAYLOAD_SCHEMA = {
123
127
  },
124
128
  "description": "Attributes the holder opts into publishing on the persona's own DID document or equivalent public surface. Empty by default and MUST remain empty unless explicitly set: everything else is a per-verifier projection, and a published value is one document every relying party sees identically — a permanent correlation point the rest of this family exists to avoid."
125
129
  },
130
+ "label": {
131
+ "type": "string",
132
+ "minLength": 1,
133
+ "maxLength": 128,
134
+ "description": "What this context may call the face the persona wears here, chosen by the holder for this context. Returned by persona/binding/get and persona/binding/list in place of the holder's own name for the face, which is theirs and may say far more than they would tell a context ('the divorce'). Omit to give the context no name at all."
135
+ },
126
136
  "expectedVersion": {
127
137
  "$ref": "#/$defs/ExpectedVersion"
128
138
  },