@openvtc/trust-tasks 0.19.18 → 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 (73) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/_shared/components.d.ts +38 -0
  3. package/dist/_shared/components.d.ts.map +1 -1
  4. package/dist/index.d.ts +3 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +3 -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 +124 -4
  11. package/dist/persona/attribute/list/1.0/payload.d.ts.map +1 -1
  12. package/dist/persona/attribute/list/1.0/payload.js +72 -2
  13. package/dist/persona/attribute/list/1.0/payload.js.map +1 -1
  14. package/dist/persona/attribute/put/1.0/payload.d.ts +110 -4
  15. package/dist/persona/attribute/put/1.0/payload.d.ts.map +1 -1
  16. package/dist/persona/attribute/put/1.0/payload.js +62 -2
  17. package/dist/persona/attribute/put/1.0/payload.js.map +1 -1
  18. package/dist/persona/contact/get/1.0/payload.d.ts +84 -4
  19. package/dist/persona/contact/get/1.0/payload.d.ts.map +1 -1
  20. package/dist/persona/contact/get/1.0/payload.js +52 -2
  21. package/dist/persona/contact/get/1.0/payload.js.map +1 -1
  22. package/dist/persona/contact/put/1.0/payload.d.ts +84 -4
  23. package/dist/persona/contact/put/1.0/payload.d.ts.map +1 -1
  24. package/dist/persona/contact/put/1.0/payload.js +52 -2
  25. package/dist/persona/contact/put/1.0/payload.js.map +1 -1
  26. package/dist/persona/disclosure/preview/1.0/payload.d.ts +5 -5
  27. package/dist/persona/disclosure/preview/1.0/payload.d.ts.map +1 -1
  28. package/dist/persona/disclosure/preview/1.0/payload.js +4 -2
  29. package/dist/persona/disclosure/preview/1.0/payload.js.map +1 -1
  30. package/dist/persona/profile/compose/1.0/payload.d.ts +14 -0
  31. package/dist/persona/profile/compose/1.0/payload.d.ts.map +1 -1
  32. package/dist/persona/profile/compose/1.0/payload.js +5 -0
  33. package/dist/persona/profile/compose/1.0/payload.js.map +1 -1
  34. package/dist/persona/profile/get/1.0/payload.d.ts +230 -6
  35. package/dist/persona/profile/get/1.0/payload.d.ts.map +1 -1
  36. package/dist/persona/profile/get/1.0/payload.js +140 -2
  37. package/dist/persona/profile/get/1.0/payload.js.map +1 -1
  38. package/dist/persona/profile/list/1.0/payload.d.ts +230 -6
  39. package/dist/persona/profile/list/1.0/payload.d.ts.map +1 -1
  40. package/dist/persona/profile/list/1.0/payload.js +140 -2
  41. package/dist/persona/profile/list/1.0/payload.js.map +1 -1
  42. package/dist/persona/profile/put/1.0/payload.d.ts +230 -6
  43. package/dist/persona/profile/put/1.0/payload.d.ts.map +1 -1
  44. package/dist/persona/profile/put/1.0/payload.js +138 -2
  45. package/dist/persona/profile/put/1.0/payload.js.map +1 -1
  46. package/dist/persona/profile/timeline/1.0/payload.d.ts +588 -0
  47. package/dist/persona/profile/timeline/1.0/payload.d.ts.map +1 -0
  48. package/dist/persona/profile/timeline/1.0/payload.js +322 -0
  49. package/dist/persona/profile/timeline/1.0/payload.js.map +1 -0
  50. package/dist/persona/profile/usage/1.0/payload.d.ts +533 -0
  51. package/dist/persona/profile/usage/1.0/payload.d.ts.map +1 -0
  52. package/dist/persona/profile/usage/1.0/payload.js +302 -0
  53. package/dist/persona/profile/usage/1.0/payload.js.map +1 -0
  54. package/dist/vtc/invitations/deliver/0.1/payload.d.ts +318 -0
  55. package/dist/vtc/invitations/deliver/0.1/payload.d.ts.map +1 -0
  56. package/dist/vtc/invitations/deliver/0.1/payload.js +183 -0
  57. package/dist/vtc/invitations/deliver/0.1/payload.js.map +1 -0
  58. package/package.json +1 -1
  59. package/src/_shared/components.ts +41 -0
  60. package/src/index.ts +3 -0
  61. package/src/persona/_shared/0.1/persona-record.ts +1 -1
  62. package/src/persona/attribute/list/1.0/payload.ts +72 -2
  63. package/src/persona/attribute/put/1.0/payload.ts +68 -2
  64. package/src/persona/contact/get/1.0/payload.ts +52 -2
  65. package/src/persona/contact/put/1.0/payload.ts +52 -2
  66. package/src/persona/disclosure/preview/1.0/payload.ts +5 -3
  67. package/src/persona/profile/compose/1.0/payload.ts +9 -0
  68. package/src/persona/profile/get/1.0/payload.ts +142 -4
  69. package/src/persona/profile/list/1.0/payload.ts +142 -4
  70. package/src/persona/profile/put/1.0/payload.ts +144 -4
  71. package/src/persona/profile/timeline/1.0/payload.ts +402 -0
  72. package/src/persona/profile/usage/1.0/payload.ts +354 -0
  73. package/src/vtc/invitations/deliver/0.1/payload.ts +234 -0
@@ -2,7 +2,7 @@
2
2
  * Generated by scripts/build-ts-bindings.mjs — DO NOT EDIT BY HAND.
3
3
  * Source: specs/persona/profile/list/1.0/payload.schema.json
4
4
  */
5
- import type { ClaimType, Ext, Profile, ProfileEntry, ProofRung, Provenance, Slot, Ulid, ValueType, Version_PersonaV0_1 as Version } from "../../../../_shared/components.js";
5
+ import type { ClaimType, Ext, FaceReach, Profile, ProfileEntry, ProofRung, Provenance, Slot, Ulid, ValueType, Version_PersonaV0_1 as Version } from "../../../../_shared/components.js";
6
6
  /**
7
7
  * Enumerate the holder's profiles. Compositions only — entries are returned, values are not.
8
8
  */
@@ -33,7 +33,7 @@ export interface PersonaProfileListResponsePayload {
33
33
  ext?: Ext;
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, Slot, Ulid, ValueType, Version };
36
+ export type { ClaimType, Ext, FaceReach, Profile, ProfileEntry, ProofRung, Provenance, Slot, Ulid, ValueType, Version };
37
37
  /** Trust Task type URI. */
38
38
  export declare const TYPE_URI: "https://trusttasks.org/spec/persona/profile/list/1.0";
39
39
  /** Stable alias for this specification's request payload shape. */
@@ -138,6 +138,9 @@ export declare const PAYLOAD_SCHEMA: {
138
138
  readonly $ref: "#/$defs/ProfileEntry";
139
139
  };
140
140
  };
141
+ readonly reach: {
142
+ readonly $ref: "#/$defs/FaceReach";
143
+ };
141
144
  readonly status: {
142
145
  readonly type: "string";
143
146
  readonly enum: readonly ["active", "retired"];
@@ -177,6 +180,39 @@ export declare const PAYLOAD_SCHEMA: {
177
180
  readonly type: "integer";
178
181
  readonly minimum: 1;
179
182
  };
183
+ readonly FaceReach: {
184
+ readonly title: "FaceReach";
185
+ readonly description: "Where a pool face may be worn. `anywhere` is the default and what an absent member means. `only` names the contexts it may be worn in, and a maintainer MUST refuse to wear it in any other (persona/binding/set `outsideReach`).\n\nA tagged object rather than a bare list of contexts, deliberately: an empty list has been read as both 'unrestricted' and 'nowhere' in this family's neighbours, and a shape where the two cannot be confused is worth more than one where they must be remembered. So `only` requires at least one context, and 'nowhere' is not a reach — it is a retired face.\n\nA context-local face has no reach: it lives in its context and is worn there by construction.";
186
+ readonly oneOf: readonly [{
187
+ readonly type: "object";
188
+ readonly additionalProperties: false;
189
+ readonly required: readonly ["kind"];
190
+ readonly properties: {
191
+ readonly kind: {
192
+ readonly const: "anywhere";
193
+ };
194
+ };
195
+ }, {
196
+ readonly type: "object";
197
+ readonly additionalProperties: false;
198
+ readonly required: readonly ["kind", "contextIds"];
199
+ readonly properties: {
200
+ readonly kind: {
201
+ readonly const: "only";
202
+ };
203
+ readonly contextIds: {
204
+ readonly type: "array";
205
+ readonly minItems: 1;
206
+ readonly maxItems: 256;
207
+ readonly uniqueItems: true;
208
+ readonly items: {
209
+ readonly type: "string";
210
+ readonly minLength: 1;
211
+ };
212
+ };
213
+ };
214
+ }];
215
+ };
180
216
  readonly ProfileEntry: {
181
217
  readonly title: "ProfileEntry";
182
218
  readonly 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.";
@@ -269,7 +305,7 @@ export declare const PAYLOAD_SCHEMA: {
269
305
  };
270
306
  readonly Provenance: {
271
307
  readonly title: "Provenance";
272
- readonly 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.";
308
+ readonly 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.";
273
309
  readonly type: "object";
274
310
  readonly required: readonly ["kind"];
275
311
  readonly oneOf: readonly [{
@@ -326,6 +362,26 @@ export declare const PAYLOAD_SCHEMA: {
326
362
  readonly description: "When true (the default and the only useful setting), a distinct value is minted for each verifier.";
327
363
  };
328
364
  };
365
+ }, {
366
+ readonly additionalProperties: false;
367
+ readonly required: readonly ["kind", "source", "derivedAt"];
368
+ readonly properties: {
369
+ readonly kind: {
370
+ readonly const: "derived";
371
+ };
372
+ readonly source: {
373
+ readonly type: "string";
374
+ readonly minLength: 1;
375
+ readonly maxLength: 64;
376
+ readonly pattern: "^[a-z][A-Za-z0-9.-]*$";
377
+ readonly 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.";
378
+ };
379
+ readonly derivedAt: {
380
+ readonly type: "string";
381
+ readonly format: "date-time";
382
+ readonly 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.";
383
+ };
384
+ };
329
385
  }];
330
386
  };
331
387
  readonly ProofRung: {
@@ -419,6 +475,9 @@ export declare const RESPONSE_PAYLOAD_SCHEMA: {
419
475
  readonly $ref: "#/$defs/ProfileEntry";
420
476
  };
421
477
  };
478
+ readonly reach: {
479
+ readonly $ref: "#/$defs/FaceReach";
480
+ };
422
481
  readonly status: {
423
482
  readonly type: "string";
424
483
  readonly enum: readonly ["active", "retired"];
@@ -458,6 +517,39 @@ export declare const RESPONSE_PAYLOAD_SCHEMA: {
458
517
  readonly type: "integer";
459
518
  readonly minimum: 1;
460
519
  };
520
+ readonly FaceReach: {
521
+ readonly title: "FaceReach";
522
+ readonly description: "Where a pool face may be worn. `anywhere` is the default and what an absent member means. `only` names the contexts it may be worn in, and a maintainer MUST refuse to wear it in any other (persona/binding/set `outsideReach`).\n\nA tagged object rather than a bare list of contexts, deliberately: an empty list has been read as both 'unrestricted' and 'nowhere' in this family's neighbours, and a shape where the two cannot be confused is worth more than one where they must be remembered. So `only` requires at least one context, and 'nowhere' is not a reach — it is a retired face.\n\nA context-local face has no reach: it lives in its context and is worn there by construction.";
523
+ readonly oneOf: readonly [{
524
+ readonly type: "object";
525
+ readonly additionalProperties: false;
526
+ readonly required: readonly ["kind"];
527
+ readonly properties: {
528
+ readonly kind: {
529
+ readonly const: "anywhere";
530
+ };
531
+ };
532
+ }, {
533
+ readonly type: "object";
534
+ readonly additionalProperties: false;
535
+ readonly required: readonly ["kind", "contextIds"];
536
+ readonly properties: {
537
+ readonly kind: {
538
+ readonly const: "only";
539
+ };
540
+ readonly contextIds: {
541
+ readonly type: "array";
542
+ readonly minItems: 1;
543
+ readonly maxItems: 256;
544
+ readonly uniqueItems: true;
545
+ readonly items: {
546
+ readonly type: "string";
547
+ readonly minLength: 1;
548
+ };
549
+ };
550
+ };
551
+ }];
552
+ };
461
553
  readonly ProfileEntry: {
462
554
  readonly title: "ProfileEntry";
463
555
  readonly 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.";
@@ -550,7 +642,7 @@ export declare const RESPONSE_PAYLOAD_SCHEMA: {
550
642
  };
551
643
  readonly Provenance: {
552
644
  readonly title: "Provenance";
553
- readonly 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.";
645
+ readonly 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.";
554
646
  readonly type: "object";
555
647
  readonly required: readonly ["kind"];
556
648
  readonly oneOf: readonly [{
@@ -607,6 +699,26 @@ export declare const RESPONSE_PAYLOAD_SCHEMA: {
607
699
  readonly description: "When true (the default and the only useful setting), a distinct value is minted for each verifier.";
608
700
  };
609
701
  };
702
+ }, {
703
+ readonly additionalProperties: false;
704
+ readonly required: readonly ["kind", "source", "derivedAt"];
705
+ readonly properties: {
706
+ readonly kind: {
707
+ readonly const: "derived";
708
+ };
709
+ readonly source: {
710
+ readonly type: "string";
711
+ readonly minLength: 1;
712
+ readonly maxLength: 64;
713
+ readonly pattern: "^[a-z][A-Za-z0-9.-]*$";
714
+ readonly 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.";
715
+ };
716
+ readonly derivedAt: {
717
+ readonly type: "string";
718
+ readonly format: "date-time";
719
+ readonly 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.";
720
+ };
721
+ };
610
722
  }];
611
723
  };
612
724
  readonly ProofRung: {
@@ -736,6 +848,9 @@ export declare const SPEC: {
736
848
  readonly $ref: "#/$defs/ProfileEntry";
737
849
  };
738
850
  };
851
+ readonly reach: {
852
+ readonly $ref: "#/$defs/FaceReach";
853
+ };
739
854
  readonly status: {
740
855
  readonly type: "string";
741
856
  readonly enum: readonly ["active", "retired"];
@@ -775,6 +890,39 @@ export declare const SPEC: {
775
890
  readonly type: "integer";
776
891
  readonly minimum: 1;
777
892
  };
893
+ readonly FaceReach: {
894
+ readonly title: "FaceReach";
895
+ readonly description: "Where a pool face may be worn. `anywhere` is the default and what an absent member means. `only` names the contexts it may be worn in, and a maintainer MUST refuse to wear it in any other (persona/binding/set `outsideReach`).\n\nA tagged object rather than a bare list of contexts, deliberately: an empty list has been read as both 'unrestricted' and 'nowhere' in this family's neighbours, and a shape where the two cannot be confused is worth more than one where they must be remembered. So `only` requires at least one context, and 'nowhere' is not a reach — it is a retired face.\n\nA context-local face has no reach: it lives in its context and is worn there by construction.";
896
+ readonly oneOf: readonly [{
897
+ readonly type: "object";
898
+ readonly additionalProperties: false;
899
+ readonly required: readonly ["kind"];
900
+ readonly properties: {
901
+ readonly kind: {
902
+ readonly const: "anywhere";
903
+ };
904
+ };
905
+ }, {
906
+ readonly type: "object";
907
+ readonly additionalProperties: false;
908
+ readonly required: readonly ["kind", "contextIds"];
909
+ readonly properties: {
910
+ readonly kind: {
911
+ readonly const: "only";
912
+ };
913
+ readonly contextIds: {
914
+ readonly type: "array";
915
+ readonly minItems: 1;
916
+ readonly maxItems: 256;
917
+ readonly uniqueItems: true;
918
+ readonly items: {
919
+ readonly type: "string";
920
+ readonly minLength: 1;
921
+ };
922
+ };
923
+ };
924
+ }];
925
+ };
778
926
  readonly ProfileEntry: {
779
927
  readonly title: "ProfileEntry";
780
928
  readonly 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.";
@@ -867,7 +1015,7 @@ export declare const SPEC: {
867
1015
  };
868
1016
  readonly Provenance: {
869
1017
  readonly title: "Provenance";
870
- readonly 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.";
1018
+ readonly 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.";
871
1019
  readonly type: "object";
872
1020
  readonly required: readonly ["kind"];
873
1021
  readonly oneOf: readonly [{
@@ -924,6 +1072,26 @@ export declare const SPEC: {
924
1072
  readonly description: "When true (the default and the only useful setting), a distinct value is minted for each verifier.";
925
1073
  };
926
1074
  };
1075
+ }, {
1076
+ readonly additionalProperties: false;
1077
+ readonly required: readonly ["kind", "source", "derivedAt"];
1078
+ readonly properties: {
1079
+ readonly kind: {
1080
+ readonly const: "derived";
1081
+ };
1082
+ readonly source: {
1083
+ readonly type: "string";
1084
+ readonly minLength: 1;
1085
+ readonly maxLength: 64;
1086
+ readonly pattern: "^[a-z][A-Za-z0-9.-]*$";
1087
+ readonly 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.";
1088
+ };
1089
+ readonly derivedAt: {
1090
+ readonly type: "string";
1091
+ readonly format: "date-time";
1092
+ readonly 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.";
1093
+ };
1094
+ };
927
1095
  }];
928
1096
  };
929
1097
  readonly ProofRung: {
@@ -1028,6 +1196,9 @@ export declare const RESPONSE_SPEC: {
1028
1196
  readonly $ref: "#/$defs/ProfileEntry";
1029
1197
  };
1030
1198
  };
1199
+ readonly reach: {
1200
+ readonly $ref: "#/$defs/FaceReach";
1201
+ };
1031
1202
  readonly status: {
1032
1203
  readonly type: "string";
1033
1204
  readonly enum: readonly ["active", "retired"];
@@ -1067,6 +1238,39 @@ export declare const RESPONSE_SPEC: {
1067
1238
  readonly type: "integer";
1068
1239
  readonly minimum: 1;
1069
1240
  };
1241
+ readonly FaceReach: {
1242
+ readonly title: "FaceReach";
1243
+ readonly description: "Where a pool face may be worn. `anywhere` is the default and what an absent member means. `only` names the contexts it may be worn in, and a maintainer MUST refuse to wear it in any other (persona/binding/set `outsideReach`).\n\nA tagged object rather than a bare list of contexts, deliberately: an empty list has been read as both 'unrestricted' and 'nowhere' in this family's neighbours, and a shape where the two cannot be confused is worth more than one where they must be remembered. So `only` requires at least one context, and 'nowhere' is not a reach — it is a retired face.\n\nA context-local face has no reach: it lives in its context and is worn there by construction.";
1244
+ readonly oneOf: readonly [{
1245
+ readonly type: "object";
1246
+ readonly additionalProperties: false;
1247
+ readonly required: readonly ["kind"];
1248
+ readonly properties: {
1249
+ readonly kind: {
1250
+ readonly const: "anywhere";
1251
+ };
1252
+ };
1253
+ }, {
1254
+ readonly type: "object";
1255
+ readonly additionalProperties: false;
1256
+ readonly required: readonly ["kind", "contextIds"];
1257
+ readonly properties: {
1258
+ readonly kind: {
1259
+ readonly const: "only";
1260
+ };
1261
+ readonly contextIds: {
1262
+ readonly type: "array";
1263
+ readonly minItems: 1;
1264
+ readonly maxItems: 256;
1265
+ readonly uniqueItems: true;
1266
+ readonly items: {
1267
+ readonly type: "string";
1268
+ readonly minLength: 1;
1269
+ };
1270
+ };
1271
+ };
1272
+ }];
1273
+ };
1070
1274
  readonly ProfileEntry: {
1071
1275
  readonly title: "ProfileEntry";
1072
1276
  readonly 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.";
@@ -1159,7 +1363,7 @@ export declare const RESPONSE_SPEC: {
1159
1363
  };
1160
1364
  readonly Provenance: {
1161
1365
  readonly title: "Provenance";
1162
- readonly 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.";
1366
+ readonly 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.";
1163
1367
  readonly type: "object";
1164
1368
  readonly required: readonly ["kind"];
1165
1369
  readonly oneOf: readonly [{
@@ -1216,6 +1420,26 @@ export declare const RESPONSE_SPEC: {
1216
1420
  readonly description: "When true (the default and the only useful setting), a distinct value is minted for each verifier.";
1217
1421
  };
1218
1422
  };
1423
+ }, {
1424
+ readonly additionalProperties: false;
1425
+ readonly required: readonly ["kind", "source", "derivedAt"];
1426
+ readonly properties: {
1427
+ readonly kind: {
1428
+ readonly const: "derived";
1429
+ };
1430
+ readonly source: {
1431
+ readonly type: "string";
1432
+ readonly minLength: 1;
1433
+ readonly maxLength: 64;
1434
+ readonly pattern: "^[a-z][A-Za-z0-9.-]*$";
1435
+ readonly 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.";
1436
+ };
1437
+ readonly derivedAt: {
1438
+ readonly type: "string";
1439
+ readonly format: "date-time";
1440
+ readonly 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.";
1441
+ };
1442
+ };
1219
1443
  }];
1220
1444
  };
1221
1445
  readonly ProofRung: {
@@ -1 +1 @@
1
- {"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../../../../src/persona/profile/list/1.0/payload.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../../../../src/persona/profile/list/1.0/payload.ts"],"names":[],"mappings":"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"}
@@ -110,6 +110,9 @@ export const PAYLOAD_SCHEMA = {
110
110
  "$ref": "#/$defs/ProfileEntry"
111
111
  }
112
112
  },
113
+ "reach": {
114
+ "$ref": "#/$defs/FaceReach"
115
+ },
113
116
  "status": {
114
117
  "type": "string",
115
118
  "enum": [
@@ -152,6 +155,47 @@ export const PAYLOAD_SCHEMA = {
152
155
  "type": "integer",
153
156
  "minimum": 1
154
157
  },
158
+ "FaceReach": {
159
+ "title": "FaceReach",
160
+ "description": "Where a pool face may be worn. `anywhere` is the default and what an absent member means. `only` names the contexts it may be worn in, and a maintainer MUST refuse to wear it in any other (persona/binding/set `outsideReach`).\n\nA tagged object rather than a bare list of contexts, deliberately: an empty list has been read as both 'unrestricted' and 'nowhere' in this family's neighbours, and a shape where the two cannot be confused is worth more than one where they must be remembered. So `only` requires at least one context, and 'nowhere' is not a reach — it is a retired face.\n\nA context-local face has no reach: it lives in its context and is worn there by construction.",
161
+ "oneOf": [
162
+ {
163
+ "type": "object",
164
+ "additionalProperties": false,
165
+ "required": [
166
+ "kind"
167
+ ],
168
+ "properties": {
169
+ "kind": {
170
+ "const": "anywhere"
171
+ }
172
+ }
173
+ },
174
+ {
175
+ "type": "object",
176
+ "additionalProperties": false,
177
+ "required": [
178
+ "kind",
179
+ "contextIds"
180
+ ],
181
+ "properties": {
182
+ "kind": {
183
+ "const": "only"
184
+ },
185
+ "contextIds": {
186
+ "type": "array",
187
+ "minItems": 1,
188
+ "maxItems": 256,
189
+ "uniqueItems": true,
190
+ "items": {
191
+ "type": "string",
192
+ "minLength": 1
193
+ }
194
+ }
195
+ }
196
+ }
197
+ ]
198
+ },
155
199
  "ProfileEntry": {
156
200
  "title": "ProfileEntry",
157
201
  "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.",
@@ -266,7 +310,7 @@ export const PAYLOAD_SCHEMA = {
266
310
  },
267
311
  "Provenance": {
268
312
  "title": "Provenance",
269
- "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.",
313
+ "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.",
270
314
  "type": "object",
271
315
  "required": [
272
316
  "kind"
@@ -337,6 +381,31 @@ export const PAYLOAD_SCHEMA = {
337
381
  "description": "When true (the default and the only useful setting), a distinct value is minted for each verifier."
338
382
  }
339
383
  }
384
+ },
385
+ {
386
+ "additionalProperties": false,
387
+ "required": [
388
+ "kind",
389
+ "source",
390
+ "derivedAt"
391
+ ],
392
+ "properties": {
393
+ "kind": {
394
+ "const": "derived"
395
+ },
396
+ "source": {
397
+ "type": "string",
398
+ "minLength": 1,
399
+ "maxLength": 64,
400
+ "pattern": "^[a-z][A-Za-z0-9.-]*$",
401
+ "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."
402
+ },
403
+ "derivedAt": {
404
+ "type": "string",
405
+ "format": "date-time",
406
+ "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."
407
+ }
408
+ }
340
409
  }
341
410
  ]
342
411
  },
@@ -450,6 +519,9 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
450
519
  "$ref": "#/$defs/ProfileEntry"
451
520
  }
452
521
  },
522
+ "reach": {
523
+ "$ref": "#/$defs/FaceReach"
524
+ },
453
525
  "status": {
454
526
  "type": "string",
455
527
  "enum": [
@@ -492,6 +564,47 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
492
564
  "type": "integer",
493
565
  "minimum": 1
494
566
  },
567
+ "FaceReach": {
568
+ "title": "FaceReach",
569
+ "description": "Where a pool face may be worn. `anywhere` is the default and what an absent member means. `only` names the contexts it may be worn in, and a maintainer MUST refuse to wear it in any other (persona/binding/set `outsideReach`).\n\nA tagged object rather than a bare list of contexts, deliberately: an empty list has been read as both 'unrestricted' and 'nowhere' in this family's neighbours, and a shape where the two cannot be confused is worth more than one where they must be remembered. So `only` requires at least one context, and 'nowhere' is not a reach — it is a retired face.\n\nA context-local face has no reach: it lives in its context and is worn there by construction.",
570
+ "oneOf": [
571
+ {
572
+ "type": "object",
573
+ "additionalProperties": false,
574
+ "required": [
575
+ "kind"
576
+ ],
577
+ "properties": {
578
+ "kind": {
579
+ "const": "anywhere"
580
+ }
581
+ }
582
+ },
583
+ {
584
+ "type": "object",
585
+ "additionalProperties": false,
586
+ "required": [
587
+ "kind",
588
+ "contextIds"
589
+ ],
590
+ "properties": {
591
+ "kind": {
592
+ "const": "only"
593
+ },
594
+ "contextIds": {
595
+ "type": "array",
596
+ "minItems": 1,
597
+ "maxItems": 256,
598
+ "uniqueItems": true,
599
+ "items": {
600
+ "type": "string",
601
+ "minLength": 1
602
+ }
603
+ }
604
+ }
605
+ }
606
+ ]
607
+ },
495
608
  "ProfileEntry": {
496
609
  "title": "ProfileEntry",
497
610
  "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.",
@@ -606,7 +719,7 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
606
719
  },
607
720
  "Provenance": {
608
721
  "title": "Provenance",
609
- "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.",
722
+ "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.",
610
723
  "type": "object",
611
724
  "required": [
612
725
  "kind"
@@ -677,6 +790,31 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
677
790
  "description": "When true (the default and the only useful setting), a distinct value is minted for each verifier."
678
791
  }
679
792
  }
793
+ },
794
+ {
795
+ "additionalProperties": false,
796
+ "required": [
797
+ "kind",
798
+ "source",
799
+ "derivedAt"
800
+ ],
801
+ "properties": {
802
+ "kind": {
803
+ "const": "derived"
804
+ },
805
+ "source": {
806
+ "type": "string",
807
+ "minLength": 1,
808
+ "maxLength": 64,
809
+ "pattern": "^[a-z][A-Za-z0-9.-]*$",
810
+ "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."
811
+ },
812
+ "derivedAt": {
813
+ "type": "string",
814
+ "format": "date-time",
815
+ "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."
816
+ }
817
+ }
680
818
  }
681
819
  ]
682
820
  },