@openvtc/trust-tasks 0.19.17 → 0.19.19

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 (127) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/_runtime/consume.d.ts +1 -1
  3. package/dist/_runtime/consume.js +2 -2
  4. package/dist/_shared/components.d.ts +46 -0
  5. package/dist/_shared/components.d.ts.map +1 -1
  6. package/dist/index.d.ts +8 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +8 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/persona/_shared/0.1/persona-record.d.ts +1 -1
  11. package/dist/persona/_shared/0.1/persona-record.d.ts.map +1 -1
  12. package/dist/persona/attribute/list/1.0/payload.d.ts +124 -4
  13. package/dist/persona/attribute/list/1.0/payload.d.ts.map +1 -1
  14. package/dist/persona/attribute/list/1.0/payload.js +72 -2
  15. package/dist/persona/attribute/list/1.0/payload.js.map +1 -1
  16. package/dist/persona/attribute/promote/1.0/payload.d.ts +506 -0
  17. package/dist/persona/attribute/promote/1.0/payload.d.ts.map +1 -0
  18. package/dist/persona/attribute/promote/1.0/payload.js +263 -0
  19. package/dist/persona/attribute/promote/1.0/payload.js.map +1 -0
  20. package/dist/persona/attribute/put/1.0/payload.d.ts +110 -4
  21. package/dist/persona/attribute/put/1.0/payload.d.ts.map +1 -1
  22. package/dist/persona/attribute/put/1.0/payload.js +62 -2
  23. package/dist/persona/attribute/put/1.0/payload.js.map +1 -1
  24. package/dist/persona/binding/get/1.0/payload.d.ts +24 -0
  25. package/dist/persona/binding/get/1.0/payload.d.ts.map +1 -1
  26. package/dist/persona/binding/get/1.0/payload.js +10 -0
  27. package/dist/persona/binding/get/1.0/payload.js.map +1 -1
  28. package/dist/persona/binding/list/1.0/payload.d.ts +24 -0
  29. package/dist/persona/binding/list/1.0/payload.d.ts.map +1 -1
  30. package/dist/persona/binding/list/1.0/payload.js +10 -0
  31. package/dist/persona/binding/list/1.0/payload.js.map +1 -1
  32. package/dist/persona/binding/set/1.0/payload.d.ts +38 -0
  33. package/dist/persona/binding/set/1.0/payload.d.ts.map +1 -1
  34. package/dist/persona/binding/set/1.0/payload.js +15 -0
  35. package/dist/persona/binding/set/1.0/payload.js.map +1 -1
  36. package/dist/persona/contact/get/1.0/payload.d.ts +84 -4
  37. package/dist/persona/contact/get/1.0/payload.d.ts.map +1 -1
  38. package/dist/persona/contact/get/1.0/payload.js +52 -2
  39. package/dist/persona/contact/get/1.0/payload.js.map +1 -1
  40. package/dist/persona/contact/put/1.0/payload.d.ts +84 -4
  41. package/dist/persona/contact/put/1.0/payload.d.ts.map +1 -1
  42. package/dist/persona/contact/put/1.0/payload.js +52 -2
  43. package/dist/persona/contact/put/1.0/payload.js.map +1 -1
  44. package/dist/persona/disclosure/preview/1.0/payload.d.ts +5 -5
  45. package/dist/persona/disclosure/preview/1.0/payload.d.ts.map +1 -1
  46. package/dist/persona/disclosure/preview/1.0/payload.js +4 -2
  47. package/dist/persona/disclosure/preview/1.0/payload.js.map +1 -1
  48. package/dist/persona/local/binding/set/1.0/payload.d.ts +14 -0
  49. package/dist/persona/local/binding/set/1.0/payload.d.ts.map +1 -1
  50. package/dist/persona/local/binding/set/1.0/payload.js +5 -0
  51. package/dist/persona/local/binding/set/1.0/payload.js.map +1 -1
  52. package/dist/persona/profile/compose/1.0/payload.d.ts +965 -0
  53. package/dist/persona/profile/compose/1.0/payload.d.ts.map +1 -0
  54. package/dist/persona/profile/compose/1.0/payload.js +531 -0
  55. package/dist/persona/profile/compose/1.0/payload.js.map +1 -0
  56. package/dist/persona/profile/delete/1.0/payload.d.ts +71 -0
  57. package/dist/persona/profile/delete/1.0/payload.d.ts.map +1 -1
  58. package/dist/persona/profile/delete/1.0/payload.js +38 -0
  59. package/dist/persona/profile/delete/1.0/payload.js.map +1 -1
  60. package/dist/persona/profile/get/1.0/payload.d.ts +345 -6
  61. package/dist/persona/profile/get/1.0/payload.d.ts.map +1 -1
  62. package/dist/persona/profile/get/1.0/payload.js +206 -2
  63. package/dist/persona/profile/get/1.0/payload.js.map +1 -1
  64. package/dist/persona/profile/list/1.0/payload.d.ts +288 -6
  65. package/dist/persona/profile/list/1.0/payload.d.ts.map +1 -1
  66. package/dist/persona/profile/list/1.0/payload.js +173 -2
  67. package/dist/persona/profile/list/1.0/payload.js.map +1 -1
  68. package/dist/persona/profile/put/1.0/payload.d.ts +230 -6
  69. package/dist/persona/profile/put/1.0/payload.d.ts.map +1 -1
  70. package/dist/persona/profile/put/1.0/payload.js +138 -2
  71. package/dist/persona/profile/put/1.0/payload.js.map +1 -1
  72. package/dist/persona/profile/reinstate/1.0/payload.d.ts +325 -0
  73. package/dist/persona/profile/reinstate/1.0/payload.d.ts.map +1 -0
  74. package/dist/persona/profile/reinstate/1.0/payload.js +181 -0
  75. package/dist/persona/profile/reinstate/1.0/payload.js.map +1 -0
  76. package/dist/persona/profile/retire/1.0/payload.d.ts +436 -0
  77. package/dist/persona/profile/retire/1.0/payload.d.ts.map +1 -0
  78. package/dist/persona/profile/retire/1.0/payload.js +238 -0
  79. package/dist/persona/profile/retire/1.0/payload.js.map +1 -0
  80. package/dist/persona/profile/timeline/1.0/payload.d.ts +588 -0
  81. package/dist/persona/profile/timeline/1.0/payload.d.ts.map +1 -0
  82. package/dist/persona/profile/timeline/1.0/payload.js +322 -0
  83. package/dist/persona/profile/timeline/1.0/payload.js.map +1 -0
  84. package/dist/persona/profile/usage/1.0/payload.d.ts +533 -0
  85. package/dist/persona/profile/usage/1.0/payload.d.ts.map +1 -0
  86. package/dist/persona/profile/usage/1.0/payload.js +302 -0
  87. package/dist/persona/profile/usage/1.0/payload.js.map +1 -0
  88. package/dist/trust-task-control/0.1/payload.d.ts +19 -19
  89. package/dist/trust-task-control/0.1/payload.js +7 -7
  90. package/dist/trust-task-discovery/0.1/payload.d.ts +3 -3
  91. package/dist/trust-task-discovery/0.1/payload.js +1 -1
  92. package/dist/trust-task-discovery/0.2/payload.d.ts +368 -0
  93. package/dist/trust-task-discovery/0.2/payload.d.ts.map +1 -0
  94. package/dist/trust-task-discovery/0.2/payload.js +186 -0
  95. package/dist/trust-task-discovery/0.2/payload.js.map +1 -0
  96. package/dist/vtc/invitations/deliver/0.1/payload.d.ts +318 -0
  97. package/dist/vtc/invitations/deliver/0.1/payload.d.ts.map +1 -0
  98. package/dist/vtc/invitations/deliver/0.1/payload.js +183 -0
  99. package/dist/vtc/invitations/deliver/0.1/payload.js.map +1 -0
  100. package/package.json +1 -1
  101. package/src/_runtime/consume.ts +2 -2
  102. package/src/_shared/components.ts +49 -0
  103. package/src/index.ts +8 -0
  104. package/src/persona/_shared/0.1/persona-record.ts +1 -1
  105. package/src/persona/attribute/list/1.0/payload.ts +72 -2
  106. package/src/persona/attribute/promote/1.0/payload.ts +344 -0
  107. package/src/persona/attribute/put/1.0/payload.ts +68 -2
  108. package/src/persona/binding/get/1.0/payload.ts +14 -0
  109. package/src/persona/binding/list/1.0/payload.ts +14 -0
  110. package/src/persona/binding/set/1.0/payload.ts +23 -0
  111. package/src/persona/contact/get/1.0/payload.ts +52 -2
  112. package/src/persona/contact/put/1.0/payload.ts +52 -2
  113. package/src/persona/disclosure/preview/1.0/payload.ts +5 -3
  114. package/src/persona/local/binding/set/1.0/payload.ts +9 -0
  115. package/src/persona/profile/compose/1.0/payload.ts +650 -0
  116. package/src/persona/profile/delete/1.0/payload.ts +45 -0
  117. package/src/persona/profile/get/1.0/payload.ts +215 -4
  118. package/src/persona/profile/list/1.0/payload.ts +179 -4
  119. package/src/persona/profile/put/1.0/payload.ts +144 -4
  120. package/src/persona/profile/reinstate/1.0/payload.ts +219 -0
  121. package/src/persona/profile/retire/1.0/payload.ts +289 -0
  122. package/src/persona/profile/timeline/1.0/payload.ts +402 -0
  123. package/src/persona/profile/usage/1.0/payload.ts +354 -0
  124. package/src/trust-task-control/0.1/payload.ts +12 -12
  125. package/src/trust-task-discovery/0.1/payload.ts +2 -2
  126. package/src/trust-task-discovery/0.2/payload.ts +286 -0
  127. package/src/vtc/invitations/deliver/0.1/payload.ts +234 -0
@@ -41,6 +41,10 @@ export interface PersonaBindingGetResponsePayload {
41
41
  */
42
42
  claimCount?: number;
43
43
  boundAt?: string;
44
+ /**
45
+ * When this binding ends on its own. Absent when it lasts until changed. Context-visible: the context learns when the face stops being worn here, which is the thing the holder set it to tell.
46
+ */
47
+ until?: string;
44
48
  ext?: Ext;
45
49
  }
46
50
 
@@ -142,6 +146,11 @@ export const PAYLOAD_SCHEMA = {
142
146
  "type": "string",
143
147
  "format": "date-time"
144
148
  },
149
+ "until": {
150
+ "type": "string",
151
+ "format": "date-time",
152
+ "description": "When this binding ends on its own. Absent when it lasts until changed. Context-visible: the context learns when the face stops being worn here, which is the thing the holder set it to tell."
153
+ },
145
154
  "ext": {
146
155
  "$ref": "#/$defs/Ext"
147
156
  }
@@ -219,6 +228,11 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
219
228
  "type": "string",
220
229
  "format": "date-time"
221
230
  },
231
+ "until": {
232
+ "type": "string",
233
+ "format": "date-time",
234
+ "description": "When this binding ends on its own. Absent when it lasts until changed. Context-visible: the context learns when the face stops being worn here, which is the thing the holder set it to tell."
235
+ },
222
236
  "ext": {
223
237
  "$ref": "#/$defs/Ext"
224
238
  }
@@ -29,6 +29,10 @@ export interface PersonaBindingListResponsePayload {
29
29
  * The name the holder chose for this context to call the face. Absent when they chose none.
30
30
  */
31
31
  label?: string;
32
+ /**
33
+ * When this binding ends on its own. Absent when it lasts until changed.
34
+ */
35
+ until?: string;
32
36
  /**
33
37
  * The holder's OWN name for the bound face. A maintainer MUST omit it unless the caller is holder-authorized; see persona/binding/get.
34
38
  */
@@ -131,6 +135,11 @@ export const PAYLOAD_SCHEMA = {
131
135
  "maxLength": 128,
132
136
  "description": "The name the holder chose for this context to call the face. Absent when they chose none."
133
137
  },
138
+ "until": {
139
+ "type": "string",
140
+ "format": "date-time",
141
+ "description": "When this binding ends on its own. Absent when it lasts until changed."
142
+ },
134
143
  "profileName": {
135
144
  "type": "string",
136
145
  "maxLength": 128,
@@ -208,6 +217,11 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
208
217
  "maxLength": 128,
209
218
  "description": "The name the holder chose for this context to call the face. Absent when they chose none."
210
219
  },
220
+ "until": {
221
+ "type": "string",
222
+ "format": "date-time",
223
+ "description": "When this binding ends on its own. Absent when it lasts until changed."
224
+ },
211
225
  "profileName": {
212
226
  "type": "string",
213
227
  "maxLength": 128,
@@ -32,6 +32,10 @@ export interface PersonaBindingSetPayload {
32
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
33
  */
34
34
  label?: string;
35
+ /**
36
+ * When this binding ends on its own. At `until` the maintainer clears the binding as a null persona/binding/set would; if the face is then worn nowhere, it is retired (persona/profile/retire), never deleted, so its history survives. Absent means the binding lasts until changed. For the face worn for one weekend — a conference, a listing — so that ending it is a default rather than a discipline. A maintainer MUST refuse an `until` that is not in the future, and one given with a null `profileId`.
37
+ */
38
+ until?: string;
35
39
  expectedVersion?: ExpectedVersion;
36
40
  ext?: Ext;
37
41
  }
@@ -58,6 +62,10 @@ export interface PersonaBindingSetResponsePayload {
58
62
  alsoBoundPersonaCount?: number;
59
63
  };
60
64
  boundAt: string;
65
+ /**
66
+ * When this binding ends on its own, as set.
67
+ */
68
+ until?: string;
61
69
  ext?: Ext;
62
70
  }
63
71
 
@@ -133,6 +141,11 @@ export const PAYLOAD_SCHEMA = {
133
141
  "maxLength": 128,
134
142
  "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
143
  },
144
+ "until": {
145
+ "type": "string",
146
+ "format": "date-time",
147
+ "description": "When this binding ends on its own. At `until` the maintainer clears the binding as a null persona/binding/set would; if the face is then worn nowhere, it is retired (persona/profile/retire), never deleted, so its history survives. Absent means the binding lasts until changed. For the face worn for one weekend — a conference, a listing — so that ending it is a default rather than a discipline. A maintainer MUST refuse an `until` that is not in the future, and one given with a null `profileId`."
148
+ },
136
149
  "expectedVersion": {
137
150
  "$ref": "#/$defs/ExpectedVersion"
138
151
  },
@@ -207,6 +220,11 @@ export const PAYLOAD_SCHEMA = {
207
220
  "type": "string",
208
221
  "format": "date-time"
209
222
  },
223
+ "until": {
224
+ "type": "string",
225
+ "format": "date-time",
226
+ "description": "When this binding ends on its own, as set."
227
+ },
210
228
  "ext": {
211
229
  "$ref": "#/$defs/Ext"
212
230
  }
@@ -314,6 +332,11 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
314
332
  "type": "string",
315
333
  "format": "date-time"
316
334
  },
335
+ "until": {
336
+ "type": "string",
337
+ "format": "date-time",
338
+ "description": "When this binding ends on its own, as set."
339
+ },
317
340
  "ext": {
318
341
  "$ref": "#/$defs/Ext"
319
342
  }
@@ -251,7 +251,7 @@ export const PAYLOAD_SCHEMA = {
251
251
  },
252
252
  "Provenance": {
253
253
  "title": "Provenance",
254
- "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.",
254
+ "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.\n\n`derived` — the value was taken from a source the holder connected or supplied — a code-hosting profile, an uploaded CV — rather than typed by them or attested by an issuer. Nobody signed it: it is the holder's claim that the source said so, and a consumer MUST NOT present it as attested. It exists as its own kind because a derived value is neither of the others — the holder did not author it, and no one vouches for it — and a holder deciding whether to disclose deserves to know which of their values they typed.\n\nFor how strongly a disclosed value identifies the holder, the kinds rank `credentialBacked` above `derived` above `selfAsserted`; `generated` values are per-verifier and do not correlate.",
255
255
  "type": "object",
256
256
  "required": [
257
257
  "kind"
@@ -322,6 +322,31 @@ export const PAYLOAD_SCHEMA = {
322
322
  "description": "When true (the default and the only useful setting), a distinct value is minted for each verifier."
323
323
  }
324
324
  }
325
+ },
326
+ {
327
+ "additionalProperties": false,
328
+ "required": [
329
+ "kind",
330
+ "source",
331
+ "derivedAt"
332
+ ],
333
+ "properties": {
334
+ "kind": {
335
+ "const": "derived"
336
+ },
337
+ "source": {
338
+ "type": "string",
339
+ "minLength": 1,
340
+ "maxLength": 64,
341
+ "pattern": "^[a-z][A-Za-z0-9.-]*$",
342
+ "description": "The KIND of source the value was taken from — `github`, `cvUpload`, `linkedIn` — never an account, handle or URL. Provenance survives to the verifier, so this member is disclosed with the claim; a handle here would disclose an identifier the holder never chose to share."
343
+ },
344
+ "derivedAt": {
345
+ "type": "string",
346
+ "format": "date-time",
347
+ "description": "When the value was taken from the source. A derived value is a snapshot: the source may have changed since, and nothing re-derives it."
348
+ }
349
+ }
325
350
  }
326
351
  ]
327
352
  },
@@ -518,7 +543,7 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
518
543
  },
519
544
  "Provenance": {
520
545
  "title": "Provenance",
521
- "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.",
546
+ "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.\n\n`derived` — the value was taken from a source the holder connected or supplied — a code-hosting profile, an uploaded CV — rather than typed by them or attested by an issuer. Nobody signed it: it is the holder's claim that the source said so, and a consumer MUST NOT present it as attested. It exists as its own kind because a derived value is neither of the others — the holder did not author it, and no one vouches for it — and a holder deciding whether to disclose deserves to know which of their values they typed.\n\nFor how strongly a disclosed value identifies the holder, the kinds rank `credentialBacked` above `derived` above `selfAsserted`; `generated` values are per-verifier and do not correlate.",
522
547
  "type": "object",
523
548
  "required": [
524
549
  "kind"
@@ -589,6 +614,31 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
589
614
  "description": "When true (the default and the only useful setting), a distinct value is minted for each verifier."
590
615
  }
591
616
  }
617
+ },
618
+ {
619
+ "additionalProperties": false,
620
+ "required": [
621
+ "kind",
622
+ "source",
623
+ "derivedAt"
624
+ ],
625
+ "properties": {
626
+ "kind": {
627
+ "const": "derived"
628
+ },
629
+ "source": {
630
+ "type": "string",
631
+ "minLength": 1,
632
+ "maxLength": 64,
633
+ "pattern": "^[a-z][A-Za-z0-9.-]*$",
634
+ "description": "The KIND of source the value was taken from — `github`, `cvUpload`, `linkedIn` — never an account, handle or URL. Provenance survives to the verifier, so this member is disclosed with the claim; a handle here would disclose an identifier the holder never chose to share."
635
+ },
636
+ "derivedAt": {
637
+ "type": "string",
638
+ "format": "date-time",
639
+ "description": "When the value was taken from the source. A derived value is a snapshot: the source may have changed since, and nothing re-derives it."
640
+ }
641
+ }
592
642
  }
593
643
  ]
594
644
  },
@@ -236,7 +236,7 @@ export const PAYLOAD_SCHEMA = {
236
236
  },
237
237
  "Provenance": {
238
238
  "title": "Provenance",
239
- "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.",
239
+ "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.\n\n`derived` — the value was taken from a source the holder connected or supplied — a code-hosting profile, an uploaded CV — rather than typed by them or attested by an issuer. Nobody signed it: it is the holder's claim that the source said so, and a consumer MUST NOT present it as attested. It exists as its own kind because a derived value is neither of the others — the holder did not author it, and no one vouches for it — and a holder deciding whether to disclose deserves to know which of their values they typed.\n\nFor how strongly a disclosed value identifies the holder, the kinds rank `credentialBacked` above `derived` above `selfAsserted`; `generated` values are per-verifier and do not correlate.",
240
240
  "type": "object",
241
241
  "required": [
242
242
  "kind"
@@ -307,6 +307,31 @@ export const PAYLOAD_SCHEMA = {
307
307
  "description": "When true (the default and the only useful setting), a distinct value is minted for each verifier."
308
308
  }
309
309
  }
310
+ },
311
+ {
312
+ "additionalProperties": false,
313
+ "required": [
314
+ "kind",
315
+ "source",
316
+ "derivedAt"
317
+ ],
318
+ "properties": {
319
+ "kind": {
320
+ "const": "derived"
321
+ },
322
+ "source": {
323
+ "type": "string",
324
+ "minLength": 1,
325
+ "maxLength": 64,
326
+ "pattern": "^[a-z][A-Za-z0-9.-]*$",
327
+ "description": "The KIND of source the value was taken from — `github`, `cvUpload`, `linkedIn` — never an account, handle or URL. Provenance survives to the verifier, so this member is disclosed with the claim; a handle here would disclose an identifier the holder never chose to share."
328
+ },
329
+ "derivedAt": {
330
+ "type": "string",
331
+ "format": "date-time",
332
+ "description": "When the value was taken from the source. A derived value is a snapshot: the source may have changed since, and nothing re-derives it."
333
+ }
334
+ }
310
335
  }
311
336
  ]
312
337
  },
@@ -450,7 +475,7 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
450
475
  },
451
476
  "Provenance": {
452
477
  "title": "Provenance",
453
- "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.",
478
+ "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.\n\n`derived` — the value was taken from a source the holder connected or supplied — a code-hosting profile, an uploaded CV — rather than typed by them or attested by an issuer. Nobody signed it: it is the holder's claim that the source said so, and a consumer MUST NOT present it as attested. It exists as its own kind because a derived value is neither of the others — the holder did not author it, and no one vouches for it — and a holder deciding whether to disclose deserves to know which of their values they typed.\n\nFor how strongly a disclosed value identifies the holder, the kinds rank `credentialBacked` above `derived` above `selfAsserted`; `generated` values are per-verifier and do not correlate.",
454
479
  "type": "object",
455
480
  "required": [
456
481
  "kind"
@@ -521,6 +546,31 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
521
546
  "description": "When true (the default and the only useful setting), a distinct value is minted for each verifier."
522
547
  }
523
548
  }
549
+ },
550
+ {
551
+ "additionalProperties": false,
552
+ "required": [
553
+ "kind",
554
+ "source",
555
+ "derivedAt"
556
+ ],
557
+ "properties": {
558
+ "kind": {
559
+ "const": "derived"
560
+ },
561
+ "source": {
562
+ "type": "string",
563
+ "minLength": 1,
564
+ "maxLength": 64,
565
+ "pattern": "^[a-z][A-Za-z0-9.-]*$",
566
+ "description": "The KIND of source the value was taken from — `github`, `cvUpload`, `linkedIn` — never an account, handle or URL. Provenance survives to the verifier, so this member is disclosed with the claim; a handle here would disclose an identifier the holder never chose to share."
567
+ },
568
+ "derivedAt": {
569
+ "type": "string",
570
+ "format": "date-time",
571
+ "description": "When the value was taken from the source. A derived value is a snapshot: the source may have changed since, and nothing re-derives it."
572
+ }
573
+ }
524
574
  }
525
575
  ]
526
576
  },
@@ -66,7 +66,7 @@ export interface PersonaDisclosurePreviewResponsePayload {
66
66
  arg: unknown;
67
67
  over?: ClaimType;
68
68
  };
69
- provenance: "selfAsserted" | "credentialBacked" | "generated";
69
+ provenance: "selfAsserted" | "credentialBacked" | "generated" | "derived";
70
70
  rung: ProofRung;
71
71
  /**
72
72
  * True when this verifier has not previously received this claim type from this persona. What makes a preview rankable rather than a flat list — a holder needs the unusual ask to stand out from the routine one.
@@ -254,7 +254,8 @@ export const PAYLOAD_SCHEMA = {
254
254
  "enum": [
255
255
  "selfAsserted",
256
256
  "credentialBacked",
257
- "generated"
257
+ "generated",
258
+ "derived"
258
259
  ]
259
260
  },
260
261
  "rung": {
@@ -449,7 +450,8 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
449
450
  "enum": [
450
451
  "selfAsserted",
451
452
  "credentialBacked",
452
- "generated"
453
+ "generated",
454
+ "derived"
453
455
  ]
454
456
  },
455
457
  "rung": {
@@ -20,6 +20,10 @@ export interface PersonaLocalBindingSetPayload {
20
20
  * 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.
21
21
  */
22
22
  label?: string;
23
+ /**
24
+ * When this binding ends on its own. At `until` the maintainer clears the binding as a null persona/binding/set would; if the face is then worn nowhere, it is retired as persona/profile/retire would a pool face, never deleted, so its history survives. Absent means the binding lasts until changed. For the face worn for one weekend — a conference, a listing — so that ending it is a default rather than a discipline. A maintainer MUST refuse an `until` that is not in the future, and one given with a null `profileId`.
25
+ */
26
+ until?: string;
23
27
  expectedVersion?: ExpectedVersion;
24
28
  ext?: Ext;
25
29
  }
@@ -96,6 +100,11 @@ export const PAYLOAD_SCHEMA = {
96
100
  "maxLength": 128,
97
101
  "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."
98
102
  },
103
+ "until": {
104
+ "type": "string",
105
+ "format": "date-time",
106
+ "description": "When this binding ends on its own. At `until` the maintainer clears the binding as a null persona/binding/set would; if the face is then worn nowhere, it is retired as persona/profile/retire would a pool face, never deleted, so its history survives. Absent means the binding lasts until changed. For the face worn for one weekend — a conference, a listing — so that ending it is a default rather than a discipline. A maintainer MUST refuse an `until` that is not in the future, and one given with a null `profileId`."
107
+ },
99
108
  "expectedVersion": {
100
109
  "$ref": "#/$defs/ExpectedVersion"
101
110
  },