@openvtc/trust-tasks 0.19.13 → 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 (43) hide show
  1. package/CHANGELOG.md +2 -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/local/profile/put/1.0/payload.d.ts +33 -2
  19. package/dist/persona/local/profile/put/1.0/payload.d.ts.map +1 -1
  20. package/dist/persona/local/profile/put/1.0/payload.js +15 -0
  21. package/dist/persona/local/profile/put/1.0/payload.js.map +1 -1
  22. package/dist/persona/profile/get/1.0/payload.d.ts +94 -6
  23. package/dist/persona/profile/get/1.0/payload.d.ts.map +1 -1
  24. package/dist/persona/profile/get/1.0/payload.js +46 -2
  25. package/dist/persona/profile/get/1.0/payload.js.map +1 -1
  26. package/dist/persona/profile/list/1.0/payload.d.ts +78 -6
  27. package/dist/persona/profile/list/1.0/payload.d.ts.map +1 -1
  28. package/dist/persona/profile/list/1.0/payload.js +38 -2
  29. package/dist/persona/profile/list/1.0/payload.js.map +1 -1
  30. package/dist/persona/profile/put/1.0/payload.d.ts +78 -6
  31. package/dist/persona/profile/put/1.0/payload.d.ts.map +1 -1
  32. package/dist/persona/profile/put/1.0/payload.js +38 -2
  33. package/dist/persona/profile/put/1.0/payload.js.map +1 -1
  34. package/package.json +1 -1
  35. package/src/_shared/components.ts +41 -0
  36. package/src/index.ts +1 -0
  37. package/src/persona/_shared/0.1/persona-record.ts +1 -1
  38. package/src/persona/attribute/list/1.0/payload.ts +76 -12
  39. package/src/persona/attribute/purge-version/1.0/payload.ts +277 -0
  40. package/src/persona/local/profile/put/1.0/payload.ts +18 -2
  41. package/src/persona/profile/get/1.0/payload.ts +48 -4
  42. package/src/persona/profile/list/1.0/payload.ts +40 -4
  43. package/src/persona/profile/put/1.0/payload.ts +40 -4
@@ -3,7 +3,7 @@
3
3
  * Source: specs/persona/profile/list/1.0/payload.schema.json
4
4
  */
5
5
 
6
- import type { ClaimType, Ext, Profile, ProfileEntry, ProofRung, Provenance, Ulid, ValueType, Version_PersonaV0_1 as Version } from "../../../../_shared/components.js";
6
+ import type { ClaimType, Ext, Profile, ProfileEntry, ProofRung, Provenance, Slot, Ulid, ValueType, Version_PersonaV0_1 as Version } from "../../../../_shared/components.js";
7
7
 
8
8
 
9
9
  /**
@@ -33,7 +33,7 @@ export interface PersonaProfileListResponsePayload {
33
33
  }
34
34
 
35
35
  /** Shared definitions this specification references, re-exported under the names it used to declare them with. */
36
- export type { ClaimType, Ext, Profile, ProfileEntry, ProofRung, Provenance, Ulid, ValueType, Version };
36
+ export type { ClaimType, Ext, Profile, ProfileEntry, ProofRung, Provenance, Slot, Ulid, ValueType, Version };
37
37
 
38
38
  /** Trust Task type URI. */
39
39
  export const TYPE_URI = "https://trusttasks.org/spec/persona/profile/list/1.0" as const;
@@ -176,7 +176,7 @@ export const PAYLOAD_SCHEMA = {
176
176
  },
177
177
  "ProfileEntry": {
178
178
  "title": "ProfileEntry",
179
- "description": "One line of a profile, in exactly one of four forms. Together they are the whole of a profile's flexibility, and each exists for a case the others handle badly.\n\n`{ref}` — use the pool attribute, live. Editing the pool updates every profile that references it, which is the point.\n\n`{ref, pinVersion}` — use the value as it was at that version. For a profile that must keep presenting the value a counterparty already verified.\n\n`{ref, override}` — the same fact, a different value here. (\"In the gaming profile my display name is different.\")\n\n`{inline}` — a value that never enters the pool, and so never leaks into another profile.\n\nOmission is exclusion; there is no removal marker.",
179
+ "description": "One line of a profile, in exactly one of four forms. Together they are the whole of a profile's flexibility, and each exists for a case the others handle badly.\n\n`{ref}` — use the pool attribute, live. Editing the pool updates every profile that references it, which is the point.\n\n`{ref, pinVersion}` — use the value as it was at that version. For a profile that must keep presenting the value a counterparty already verified.\n\n`{ref, override}` — the same fact, a different value here. (\"In the gaming profile my display name is different.\")\n\n`{inline}` — a value that never enters the pool, and so never leaks into another profile.\n\nOmission is exclusion; there is no removal marker.\n\nAny form MAY carry a `slot` naming the role the entry plays in the profile — see `Slot`. A maintainer MUST refuse a profile in which two entries carry the same slot: a slot exists to answer one question with one entry.",
180
180
  "type": "object",
181
181
  "oneOf": [
182
182
  {
@@ -187,6 +187,9 @@ export const PAYLOAD_SCHEMA = {
187
187
  "properties": {
188
188
  "ref": {
189
189
  "$ref": "#/$defs/Ulid"
190
+ },
191
+ "slot": {
192
+ "$ref": "#/$defs/Slot"
190
193
  }
191
194
  }
192
195
  },
@@ -202,6 +205,9 @@ export const PAYLOAD_SCHEMA = {
202
205
  },
203
206
  "pinVersion": {
204
207
  "$ref": "#/$defs/Version"
208
+ },
209
+ "slot": {
210
+ "$ref": "#/$defs/Slot"
205
211
  }
206
212
  }
207
213
  },
@@ -229,6 +235,9 @@ export const PAYLOAD_SCHEMA = {
229
235
  }
230
236
  },
231
237
  "description": "Replaces the pool attribute's value for this profile only. `type`, `valueType` and `provenance` are inherited from the referenced attribute and MUST NOT be overridden — an override that changed provenance would let a self-asserted value present as attested."
238
+ },
239
+ "slot": {
240
+ "$ref": "#/$defs/Slot"
232
241
  }
233
242
  }
234
243
  },
@@ -263,11 +272,20 @@ export const PAYLOAD_SCHEMA = {
263
272
  "$ref": "#/$defs/Provenance"
264
273
  }
265
274
  }
275
+ },
276
+ "slot": {
277
+ "$ref": "#/$defs/Slot"
266
278
  }
267
279
  }
268
280
  }
269
281
  ]
270
282
  },
283
+ "Slot": {
284
+ "title": "Slot",
285
+ "type": "string",
286
+ "pattern": "^[a-z][A-Za-z0-9]{0,31}$",
287
+ "description": "A role a profile entry plays within its profile, so a consumer can find it without guessing from its claim type. A profile MAY hold several entries of one type — a legal name and a display name, two phone numbers — and only a slot says which answers a given question. Unique within a profile.\n\nWell-known slots:\n\n- `displayName` — what this face calls itself. The entry a consumer renders as the face's name to anyone it is shown to. Distinct from the profile's own `name`, which is the holder's private label and never disclosed.\n- `primaryEmail`, `primaryPhone`, `primaryAddress` — the entry to use where a counterparty asks for one of a kind and the profile holds several.\n- `avatar` — the image this face presents.\n\nOther values are the holder's or the producer's own and carry no meaning a maintainer interprets."
288
+ },
271
289
  "Provenance": {
272
290
  "title": "Provenance",
273
291
  "description": "Where a value comes from, and the member that makes this family worth building on a trust stack rather than in an address book. It survives to the verifier, so a recipient can tell — per field — what the holder typed from what an issuer attested.\n\n`selfAsserted` — the holder supplied it.\n\n`credentialBacked` — the value is derived from a credential in the vault at `claimPath`. The stored value is a CACHE FOR DISPLAY; the credential is the truth. A maintainer MUST re-derive it on read and MUST fail closed (never presenting a stale value) when the credential has been revoked, has expired, or has been archived or deleted.\n\n`generated` — the value is minted per verifier at disclosure time and recorded against that verifier, so every relying party receives a different one that routes back to the holder. This is the shape of the most widely adopted consumer privacy feature in this space; a maintainer need not operate a relay to conform, but the shape must exist, because retrofitting per-verifier values into a pool-of-values model is a migration rather than an addition.",
@@ -485,7 +503,7 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
485
503
  },
486
504
  "ProfileEntry": {
487
505
  "title": "ProfileEntry",
488
- "description": "One line of a profile, in exactly one of four forms. Together they are the whole of a profile's flexibility, and each exists for a case the others handle badly.\n\n`{ref}` — use the pool attribute, live. Editing the pool updates every profile that references it, which is the point.\n\n`{ref, pinVersion}` — use the value as it was at that version. For a profile that must keep presenting the value a counterparty already verified.\n\n`{ref, override}` — the same fact, a different value here. (\"In the gaming profile my display name is different.\")\n\n`{inline}` — a value that never enters the pool, and so never leaks into another profile.\n\nOmission is exclusion; there is no removal marker.",
506
+ "description": "One line of a profile, in exactly one of four forms. Together they are the whole of a profile's flexibility, and each exists for a case the others handle badly.\n\n`{ref}` — use the pool attribute, live. Editing the pool updates every profile that references it, which is the point.\n\n`{ref, pinVersion}` — use the value as it was at that version. For a profile that must keep presenting the value a counterparty already verified.\n\n`{ref, override}` — the same fact, a different value here. (\"In the gaming profile my display name is different.\")\n\n`{inline}` — a value that never enters the pool, and so never leaks into another profile.\n\nOmission is exclusion; there is no removal marker.\n\nAny form MAY carry a `slot` naming the role the entry plays in the profile — see `Slot`. A maintainer MUST refuse a profile in which two entries carry the same slot: a slot exists to answer one question with one entry.",
489
507
  "type": "object",
490
508
  "oneOf": [
491
509
  {
@@ -496,6 +514,9 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
496
514
  "properties": {
497
515
  "ref": {
498
516
  "$ref": "#/$defs/Ulid"
517
+ },
518
+ "slot": {
519
+ "$ref": "#/$defs/Slot"
499
520
  }
500
521
  }
501
522
  },
@@ -511,6 +532,9 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
511
532
  },
512
533
  "pinVersion": {
513
534
  "$ref": "#/$defs/Version"
535
+ },
536
+ "slot": {
537
+ "$ref": "#/$defs/Slot"
514
538
  }
515
539
  }
516
540
  },
@@ -538,6 +562,9 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
538
562
  }
539
563
  },
540
564
  "description": "Replaces the pool attribute's value for this profile only. `type`, `valueType` and `provenance` are inherited from the referenced attribute and MUST NOT be overridden — an override that changed provenance would let a self-asserted value present as attested."
565
+ },
566
+ "slot": {
567
+ "$ref": "#/$defs/Slot"
541
568
  }
542
569
  }
543
570
  },
@@ -572,11 +599,20 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
572
599
  "$ref": "#/$defs/Provenance"
573
600
  }
574
601
  }
602
+ },
603
+ "slot": {
604
+ "$ref": "#/$defs/Slot"
575
605
  }
576
606
  }
577
607
  }
578
608
  ]
579
609
  },
610
+ "Slot": {
611
+ "title": "Slot",
612
+ "type": "string",
613
+ "pattern": "^[a-z][A-Za-z0-9]{0,31}$",
614
+ "description": "A role a profile entry plays within its profile, so a consumer can find it without guessing from its claim type. A profile MAY hold several entries of one type — a legal name and a display name, two phone numbers — and only a slot says which answers a given question. Unique within a profile.\n\nWell-known slots:\n\n- `displayName` — what this face calls itself. The entry a consumer renders as the face's name to anyone it is shown to. Distinct from the profile's own `name`, which is the holder's private label and never disclosed.\n- `primaryEmail`, `primaryPhone`, `primaryAddress` — the entry to use where a counterparty asks for one of a kind and the profile holds several.\n- `avatar` — the image this face presents.\n\nOther values are the holder's or the producer's own and carry no meaning a maintainer interprets."
615
+ },
580
616
  "Provenance": {
581
617
  "title": "Provenance",
582
618
  "description": "Where a value comes from, and the member that makes this family worth building on a trust stack rather than in an address book. It survives to the verifier, so a recipient can tell — per field — what the holder typed from what an issuer attested.\n\n`selfAsserted` — the holder supplied it.\n\n`credentialBacked` — the value is derived from a credential in the vault at `claimPath`. The stored value is a CACHE FOR DISPLAY; the credential is the truth. A maintainer MUST re-derive it on read and MUST fail closed (never presenting a stale value) when the credential has been revoked, has expired, or has been archived or deleted.\n\n`generated` — the value is minted per verifier at disclosure time and recorded against that verifier, so every relying party receives a different one that routes back to the holder. This is the shape of the most widely adopted consumer privacy feature in this space; a maintainer need not operate a relay to conform, but the shape must exist, because retrofitting per-verifier values into a pool-of-values model is a migration rather than an addition.",
@@ -3,7 +3,7 @@
3
3
  * Source: specs/persona/profile/put/1.0/payload.schema.json
4
4
  */
5
5
 
6
- import type { ClaimType, ExpectedVersion_PersonaV0_1 as ExpectedVersion, Ext, ProfileEntry, ProofRung, Provenance, Ulid, ValueType, Version_PersonaV0_1 as Version } from "../../../../_shared/components.js";
6
+ import type { ClaimType, ExpectedVersion_PersonaV0_1 as ExpectedVersion, Ext, ProfileEntry, ProofRung, Provenance, Slot, Ulid, ValueType, Version_PersonaV0_1 as Version } from "../../../../_shared/components.js";
7
7
 
8
8
 
9
9
  /**
@@ -56,7 +56,7 @@ export interface PersonaProfilePutResponsePayload {
56
56
  }
57
57
 
58
58
  /** Shared definitions this specification references, re-exported under the names it used to declare them with. */
59
- export type { ClaimType, ExpectedVersion, Ext, ProfileEntry, ProofRung, Provenance, Ulid, ValueType, Version };
59
+ export type { ClaimType, ExpectedVersion, Ext, ProfileEntry, ProofRung, Provenance, Slot, Ulid, ValueType, Version };
60
60
 
61
61
  /** Trust Task type URI. */
62
62
  export const TYPE_URI = "https://trusttasks.org/spec/persona/profile/put/1.0" as const;
@@ -214,7 +214,7 @@ export const PAYLOAD_SCHEMA = {
214
214
  },
215
215
  "ProfileEntry": {
216
216
  "title": "ProfileEntry",
217
- "description": "One line of a profile, in exactly one of four forms. Together they are the whole of a profile's flexibility, and each exists for a case the others handle badly.\n\n`{ref}` — use the pool attribute, live. Editing the pool updates every profile that references it, which is the point.\n\n`{ref, pinVersion}` — use the value as it was at that version. For a profile that must keep presenting the value a counterparty already verified.\n\n`{ref, override}` — the same fact, a different value here. (\"In the gaming profile my display name is different.\")\n\n`{inline}` — a value that never enters the pool, and so never leaks into another profile.\n\nOmission is exclusion; there is no removal marker.",
217
+ "description": "One line of a profile, in exactly one of four forms. Together they are the whole of a profile's flexibility, and each exists for a case the others handle badly.\n\n`{ref}` — use the pool attribute, live. Editing the pool updates every profile that references it, which is the point.\n\n`{ref, pinVersion}` — use the value as it was at that version. For a profile that must keep presenting the value a counterparty already verified.\n\n`{ref, override}` — the same fact, a different value here. (\"In the gaming profile my display name is different.\")\n\n`{inline}` — a value that never enters the pool, and so never leaks into another profile.\n\nOmission is exclusion; there is no removal marker.\n\nAny form MAY carry a `slot` naming the role the entry plays in the profile — see `Slot`. A maintainer MUST refuse a profile in which two entries carry the same slot: a slot exists to answer one question with one entry.",
218
218
  "type": "object",
219
219
  "oneOf": [
220
220
  {
@@ -225,6 +225,9 @@ export const PAYLOAD_SCHEMA = {
225
225
  "properties": {
226
226
  "ref": {
227
227
  "$ref": "#/$defs/Ulid"
228
+ },
229
+ "slot": {
230
+ "$ref": "#/$defs/Slot"
228
231
  }
229
232
  }
230
233
  },
@@ -240,6 +243,9 @@ export const PAYLOAD_SCHEMA = {
240
243
  },
241
244
  "pinVersion": {
242
245
  "$ref": "#/$defs/Version"
246
+ },
247
+ "slot": {
248
+ "$ref": "#/$defs/Slot"
243
249
  }
244
250
  }
245
251
  },
@@ -267,6 +273,9 @@ export const PAYLOAD_SCHEMA = {
267
273
  }
268
274
  },
269
275
  "description": "Replaces the pool attribute's value for this profile only. `type`, `valueType` and `provenance` are inherited from the referenced attribute and MUST NOT be overridden — an override that changed provenance would let a self-asserted value present as attested."
276
+ },
277
+ "slot": {
278
+ "$ref": "#/$defs/Slot"
270
279
  }
271
280
  }
272
281
  },
@@ -301,11 +310,20 @@ export const PAYLOAD_SCHEMA = {
301
310
  "$ref": "#/$defs/Provenance"
302
311
  }
303
312
  }
313
+ },
314
+ "slot": {
315
+ "$ref": "#/$defs/Slot"
304
316
  }
305
317
  }
306
318
  }
307
319
  ]
308
320
  },
321
+ "Slot": {
322
+ "title": "Slot",
323
+ "type": "string",
324
+ "pattern": "^[a-z][A-Za-z0-9]{0,31}$",
325
+ "description": "A role a profile entry plays within its profile, so a consumer can find it without guessing from its claim type. A profile MAY hold several entries of one type — a legal name and a display name, two phone numbers — and only a slot says which answers a given question. Unique within a profile.\n\nWell-known slots:\n\n- `displayName` — what this face calls itself. The entry a consumer renders as the face's name to anyone it is shown to. Distinct from the profile's own `name`, which is the holder's private label and never disclosed.\n- `primaryEmail`, `primaryPhone`, `primaryAddress` — the entry to use where a counterparty asks for one of a kind and the profile holds several.\n- `avatar` — the image this face presents.\n\nOther values are the holder's or the producer's own and carry no meaning a maintainer interprets."
326
+ },
309
327
  "Provenance": {
310
328
  "title": "Provenance",
311
329
  "description": "Where a value comes from, and the member that makes this family worth building on a trust stack rather than in an address book. It survives to the verifier, so a recipient can tell — per field — what the holder typed from what an issuer attested.\n\n`selfAsserted` — the holder supplied it.\n\n`credentialBacked` — the value is derived from a credential in the vault at `claimPath`. The stored value is a CACHE FOR DISPLAY; the credential is the truth. A maintainer MUST re-derive it on read and MUST fail closed (never presenting a stale value) when the credential has been revoked, has expired, or has been archived or deleted.\n\n`generated` — the value is minted per verifier at disclosure time and recorded against that verifier, so every relying party receives a different one that routes back to the holder. This is the shape of the most widely adopted consumer privacy feature in this space; a maintainer need not operate a relay to conform, but the shape must exist, because retrofitting per-verifier values into a pool-of-values model is a migration rather than an addition.",
@@ -509,7 +527,7 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
509
527
  },
510
528
  "ProfileEntry": {
511
529
  "title": "ProfileEntry",
512
- "description": "One line of a profile, in exactly one of four forms. Together they are the whole of a profile's flexibility, and each exists for a case the others handle badly.\n\n`{ref}` — use the pool attribute, live. Editing the pool updates every profile that references it, which is the point.\n\n`{ref, pinVersion}` — use the value as it was at that version. For a profile that must keep presenting the value a counterparty already verified.\n\n`{ref, override}` — the same fact, a different value here. (\"In the gaming profile my display name is different.\")\n\n`{inline}` — a value that never enters the pool, and so never leaks into another profile.\n\nOmission is exclusion; there is no removal marker.",
530
+ "description": "One line of a profile, in exactly one of four forms. Together they are the whole of a profile's flexibility, and each exists for a case the others handle badly.\n\n`{ref}` — use the pool attribute, live. Editing the pool updates every profile that references it, which is the point.\n\n`{ref, pinVersion}` — use the value as it was at that version. For a profile that must keep presenting the value a counterparty already verified.\n\n`{ref, override}` — the same fact, a different value here. (\"In the gaming profile my display name is different.\")\n\n`{inline}` — a value that never enters the pool, and so never leaks into another profile.\n\nOmission is exclusion; there is no removal marker.\n\nAny form MAY carry a `slot` naming the role the entry plays in the profile — see `Slot`. A maintainer MUST refuse a profile in which two entries carry the same slot: a slot exists to answer one question with one entry.",
513
531
  "type": "object",
514
532
  "oneOf": [
515
533
  {
@@ -520,6 +538,9 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
520
538
  "properties": {
521
539
  "ref": {
522
540
  "$ref": "#/$defs/Ulid"
541
+ },
542
+ "slot": {
543
+ "$ref": "#/$defs/Slot"
523
544
  }
524
545
  }
525
546
  },
@@ -535,6 +556,9 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
535
556
  },
536
557
  "pinVersion": {
537
558
  "$ref": "#/$defs/Version"
559
+ },
560
+ "slot": {
561
+ "$ref": "#/$defs/Slot"
538
562
  }
539
563
  }
540
564
  },
@@ -562,6 +586,9 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
562
586
  }
563
587
  },
564
588
  "description": "Replaces the pool attribute's value for this profile only. `type`, `valueType` and `provenance` are inherited from the referenced attribute and MUST NOT be overridden — an override that changed provenance would let a self-asserted value present as attested."
589
+ },
590
+ "slot": {
591
+ "$ref": "#/$defs/Slot"
565
592
  }
566
593
  }
567
594
  },
@@ -596,11 +623,20 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
596
623
  "$ref": "#/$defs/Provenance"
597
624
  }
598
625
  }
626
+ },
627
+ "slot": {
628
+ "$ref": "#/$defs/Slot"
599
629
  }
600
630
  }
601
631
  }
602
632
  ]
603
633
  },
634
+ "Slot": {
635
+ "title": "Slot",
636
+ "type": "string",
637
+ "pattern": "^[a-z][A-Za-z0-9]{0,31}$",
638
+ "description": "A role a profile entry plays within its profile, so a consumer can find it without guessing from its claim type. A profile MAY hold several entries of one type — a legal name and a display name, two phone numbers — and only a slot says which answers a given question. Unique within a profile.\n\nWell-known slots:\n\n- `displayName` — what this face calls itself. The entry a consumer renders as the face's name to anyone it is shown to. Distinct from the profile's own `name`, which is the holder's private label and never disclosed.\n- `primaryEmail`, `primaryPhone`, `primaryAddress` — the entry to use where a counterparty asks for one of a kind and the profile holds several.\n- `avatar` — the image this face presents.\n\nOther values are the holder's or the producer's own and carry no meaning a maintainer interprets."
639
+ },
604
640
  "Provenance": {
605
641
  "title": "Provenance",
606
642
  "description": "Where a value comes from, and the member that makes this family worth building on a trust stack rather than in an address book. It survives to the verifier, so a recipient can tell — per field — what the holder typed from what an issuer attested.\n\n`selfAsserted` — the holder supplied it.\n\n`credentialBacked` — the value is derived from a credential in the vault at `claimPath`. The stored value is a CACHE FOR DISPLAY; the credential is the truth. A maintainer MUST re-derive it on read and MUST fail closed (never presenting a stale value) when the credential has been revoked, has expired, or has been archived or deleted.\n\n`generated` — the value is minted per verifier at disclosure time and recorded against that verifier, so every relying party receives a different one that routes back to the holder. This is the shape of the most widely adopted consumer privacy feature in this space; a maintainer need not operate a relay to conform, but the shape must exist, because retrofitting per-verifier values into a pool-of-values model is a migration rather than an addition.",