@openvtc/trust-tasks 0.19.18 → 0.19.20
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.
- package/CHANGELOG.md +4 -0
- package/dist/_shared/components.d.ts +38 -0
- package/dist/_shared/components.d.ts.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/persona/_shared/0.1/persona-record.d.ts +1 -1
- package/dist/persona/_shared/0.1/persona-record.d.ts.map +1 -1
- package/dist/persona/attribute/list/1.0/payload.d.ts +124 -4
- package/dist/persona/attribute/list/1.0/payload.d.ts.map +1 -1
- package/dist/persona/attribute/list/1.0/payload.js +72 -2
- package/dist/persona/attribute/list/1.0/payload.js.map +1 -1
- package/dist/persona/attribute/put/1.0/payload.d.ts +110 -4
- package/dist/persona/attribute/put/1.0/payload.d.ts.map +1 -1
- package/dist/persona/attribute/put/1.0/payload.js +62 -2
- package/dist/persona/attribute/put/1.0/payload.js.map +1 -1
- package/dist/persona/binding/set/1.0/payload.d.ts +6 -6
- package/dist/persona/binding/set/1.0/payload.d.ts.map +1 -1
- package/dist/persona/binding/set/1.0/payload.js +2 -3
- package/dist/persona/binding/set/1.0/payload.js.map +1 -1
- package/dist/persona/contact/get/1.0/payload.d.ts +84 -4
- package/dist/persona/contact/get/1.0/payload.d.ts.map +1 -1
- package/dist/persona/contact/get/1.0/payload.js +52 -2
- package/dist/persona/contact/get/1.0/payload.js.map +1 -1
- package/dist/persona/contact/put/1.0/payload.d.ts +84 -4
- package/dist/persona/contact/put/1.0/payload.d.ts.map +1 -1
- package/dist/persona/contact/put/1.0/payload.js +52 -2
- package/dist/persona/contact/put/1.0/payload.js.map +1 -1
- package/dist/persona/disclosure/preview/1.0/payload.d.ts +5 -5
- package/dist/persona/disclosure/preview/1.0/payload.d.ts.map +1 -1
- package/dist/persona/disclosure/preview/1.0/payload.js +4 -2
- package/dist/persona/disclosure/preview/1.0/payload.js.map +1 -1
- package/dist/persona/profile/compose/1.0/payload.d.ts +31 -3
- package/dist/persona/profile/compose/1.0/payload.d.ts.map +1 -1
- package/dist/persona/profile/compose/1.0/payload.js +11 -1
- package/dist/persona/profile/compose/1.0/payload.js.map +1 -1
- package/dist/persona/profile/get/1.0/payload.d.ts +230 -6
- package/dist/persona/profile/get/1.0/payload.d.ts.map +1 -1
- package/dist/persona/profile/get/1.0/payload.js +140 -2
- package/dist/persona/profile/get/1.0/payload.js.map +1 -1
- package/dist/persona/profile/list/1.0/payload.d.ts +230 -6
- package/dist/persona/profile/list/1.0/payload.d.ts.map +1 -1
- package/dist/persona/profile/list/1.0/payload.js +140 -2
- package/dist/persona/profile/list/1.0/payload.js.map +1 -1
- package/dist/persona/profile/put/1.0/payload.d.ts +230 -6
- package/dist/persona/profile/put/1.0/payload.d.ts.map +1 -1
- package/dist/persona/profile/put/1.0/payload.js +138 -2
- package/dist/persona/profile/put/1.0/payload.js.map +1 -1
- package/dist/persona/profile/timeline/1.0/payload.d.ts +588 -0
- package/dist/persona/profile/timeline/1.0/payload.d.ts.map +1 -0
- package/dist/persona/profile/timeline/1.0/payload.js +322 -0
- package/dist/persona/profile/timeline/1.0/payload.js.map +1 -0
- package/dist/persona/profile/usage/1.0/payload.d.ts +533 -0
- package/dist/persona/profile/usage/1.0/payload.d.ts.map +1 -0
- package/dist/persona/profile/usage/1.0/payload.js +302 -0
- package/dist/persona/profile/usage/1.0/payload.js.map +1 -0
- package/dist/vtc/invitations/deliver/0.1/payload.d.ts +318 -0
- package/dist/vtc/invitations/deliver/0.1/payload.d.ts.map +1 -0
- package/dist/vtc/invitations/deliver/0.1/payload.js +183 -0
- package/dist/vtc/invitations/deliver/0.1/payload.js.map +1 -0
- package/package.json +1 -1
- package/src/_shared/components.ts +41 -0
- package/src/index.ts +3 -0
- package/src/persona/_shared/0.1/persona-record.ts +1 -1
- package/src/persona/attribute/list/1.0/payload.ts +72 -2
- package/src/persona/attribute/put/1.0/payload.ts +68 -2
- package/src/persona/binding/set/1.0/payload.ts +4 -5
- package/src/persona/contact/get/1.0/payload.ts +52 -2
- package/src/persona/contact/put/1.0/payload.ts +52 -2
- package/src/persona/disclosure/preview/1.0/payload.ts +5 -3
- package/src/persona/profile/compose/1.0/payload.ts +20 -2
- package/src/persona/profile/get/1.0/payload.ts +142 -4
- package/src/persona/profile/list/1.0/payload.ts +142 -4
- package/src/persona/profile/put/1.0/payload.ts +144 -4
- package/src/persona/profile/timeline/1.0/payload.ts +402 -0
- package/src/persona/profile/usage/1.0/payload.ts +354 -0
- 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/get/1.0/payload.schema.json
|
|
4
4
|
*/
|
|
5
|
-
import type { ClaimType, Ext, Profile, ProfileEntry, ProofRung, Provenance, ResolvedClaim, Slot, Ulid, ValueType, Version_PersonaV0_1 as Version } from "../../../../_shared/components.js";
|
|
5
|
+
import type { ClaimType, Ext, FaceReach, Profile, ProfileEntry, ProofRung, Provenance, ResolvedClaim, Slot, Ulid, ValueType, Version_PersonaV0_1 as Version } from "../../../../_shared/components.js";
|
|
6
6
|
/**
|
|
7
7
|
* Read one profile, either as composed (the entries the holder wrote) or as resolved (the claims it would actually present).
|
|
8
8
|
*/
|
|
@@ -37,7 +37,7 @@ export interface PersonaProfileGetResponsePayload {
|
|
|
37
37
|
ext?: Ext;
|
|
38
38
|
}
|
|
39
39
|
/** Shared definitions this specification references, re-exported under the names it used to declare them with. */
|
|
40
|
-
export type { ClaimType, Ext, Profile, ProfileEntry, ProofRung, Provenance, ResolvedClaim, Slot, Ulid, ValueType, Version };
|
|
40
|
+
export type { ClaimType, Ext, FaceReach, Profile, ProfileEntry, ProofRung, Provenance, ResolvedClaim, Slot, Ulid, ValueType, Version };
|
|
41
41
|
/** Trust Task type URI. */
|
|
42
42
|
export declare const TYPE_URI: "https://trusttasks.org/spec/persona/profile/get/1.0";
|
|
43
43
|
/** Stable alias for this specification's request payload shape. */
|
|
@@ -187,7 +187,7 @@ export declare const PAYLOAD_SCHEMA: {
|
|
|
187
187
|
};
|
|
188
188
|
readonly Provenance: {
|
|
189
189
|
readonly title: "Provenance";
|
|
190
|
-
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.";
|
|
190
|
+
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.";
|
|
191
191
|
readonly type: "object";
|
|
192
192
|
readonly required: readonly ["kind"];
|
|
193
193
|
readonly oneOf: readonly [{
|
|
@@ -244,6 +244,26 @@ export declare const PAYLOAD_SCHEMA: {
|
|
|
244
244
|
readonly description: "When true (the default and the only useful setting), a distinct value is minted for each verifier.";
|
|
245
245
|
};
|
|
246
246
|
};
|
|
247
|
+
}, {
|
|
248
|
+
readonly additionalProperties: false;
|
|
249
|
+
readonly required: readonly ["kind", "source", "derivedAt"];
|
|
250
|
+
readonly properties: {
|
|
251
|
+
readonly kind: {
|
|
252
|
+
readonly const: "derived";
|
|
253
|
+
};
|
|
254
|
+
readonly source: {
|
|
255
|
+
readonly type: "string";
|
|
256
|
+
readonly minLength: 1;
|
|
257
|
+
readonly maxLength: 64;
|
|
258
|
+
readonly pattern: "^[a-z][A-Za-z0-9.-]*$";
|
|
259
|
+
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.";
|
|
260
|
+
};
|
|
261
|
+
readonly derivedAt: {
|
|
262
|
+
readonly type: "string";
|
|
263
|
+
readonly format: "date-time";
|
|
264
|
+
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.";
|
|
265
|
+
};
|
|
266
|
+
};
|
|
247
267
|
}];
|
|
248
268
|
};
|
|
249
269
|
readonly ProofRung: {
|
|
@@ -301,6 +321,9 @@ export declare const PAYLOAD_SCHEMA: {
|
|
|
301
321
|
readonly $ref: "#/$defs/ProfileEntry";
|
|
302
322
|
};
|
|
303
323
|
};
|
|
324
|
+
readonly reach: {
|
|
325
|
+
readonly $ref: "#/$defs/FaceReach";
|
|
326
|
+
};
|
|
304
327
|
readonly status: {
|
|
305
328
|
readonly type: "string";
|
|
306
329
|
readonly enum: readonly ["active", "retired"];
|
|
@@ -334,6 +357,39 @@ export declare const PAYLOAD_SCHEMA: {
|
|
|
334
357
|
};
|
|
335
358
|
};
|
|
336
359
|
};
|
|
360
|
+
readonly FaceReach: {
|
|
361
|
+
readonly title: "FaceReach";
|
|
362
|
+
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.";
|
|
363
|
+
readonly oneOf: readonly [{
|
|
364
|
+
readonly type: "object";
|
|
365
|
+
readonly additionalProperties: false;
|
|
366
|
+
readonly required: readonly ["kind"];
|
|
367
|
+
readonly properties: {
|
|
368
|
+
readonly kind: {
|
|
369
|
+
readonly const: "anywhere";
|
|
370
|
+
};
|
|
371
|
+
};
|
|
372
|
+
}, {
|
|
373
|
+
readonly type: "object";
|
|
374
|
+
readonly additionalProperties: false;
|
|
375
|
+
readonly required: readonly ["kind", "contextIds"];
|
|
376
|
+
readonly properties: {
|
|
377
|
+
readonly kind: {
|
|
378
|
+
readonly const: "only";
|
|
379
|
+
};
|
|
380
|
+
readonly contextIds: {
|
|
381
|
+
readonly type: "array";
|
|
382
|
+
readonly minItems: 1;
|
|
383
|
+
readonly maxItems: 256;
|
|
384
|
+
readonly uniqueItems: true;
|
|
385
|
+
readonly items: {
|
|
386
|
+
readonly type: "string";
|
|
387
|
+
readonly minLength: 1;
|
|
388
|
+
};
|
|
389
|
+
};
|
|
390
|
+
};
|
|
391
|
+
}];
|
|
392
|
+
};
|
|
337
393
|
readonly ProfileEntry: {
|
|
338
394
|
readonly title: "ProfileEntry";
|
|
339
395
|
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.";
|
|
@@ -535,7 +591,7 @@ export declare const RESPONSE_PAYLOAD_SCHEMA: {
|
|
|
535
591
|
};
|
|
536
592
|
readonly Provenance: {
|
|
537
593
|
readonly title: "Provenance";
|
|
538
|
-
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.";
|
|
594
|
+
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.";
|
|
539
595
|
readonly type: "object";
|
|
540
596
|
readonly required: readonly ["kind"];
|
|
541
597
|
readonly oneOf: readonly [{
|
|
@@ -592,6 +648,26 @@ export declare const RESPONSE_PAYLOAD_SCHEMA: {
|
|
|
592
648
|
readonly description: "When true (the default and the only useful setting), a distinct value is minted for each verifier.";
|
|
593
649
|
};
|
|
594
650
|
};
|
|
651
|
+
}, {
|
|
652
|
+
readonly additionalProperties: false;
|
|
653
|
+
readonly required: readonly ["kind", "source", "derivedAt"];
|
|
654
|
+
readonly properties: {
|
|
655
|
+
readonly kind: {
|
|
656
|
+
readonly const: "derived";
|
|
657
|
+
};
|
|
658
|
+
readonly source: {
|
|
659
|
+
readonly type: "string";
|
|
660
|
+
readonly minLength: 1;
|
|
661
|
+
readonly maxLength: 64;
|
|
662
|
+
readonly pattern: "^[a-z][A-Za-z0-9.-]*$";
|
|
663
|
+
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.";
|
|
664
|
+
};
|
|
665
|
+
readonly derivedAt: {
|
|
666
|
+
readonly type: "string";
|
|
667
|
+
readonly format: "date-time";
|
|
668
|
+
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.";
|
|
669
|
+
};
|
|
670
|
+
};
|
|
595
671
|
}];
|
|
596
672
|
};
|
|
597
673
|
readonly ProofRung: {
|
|
@@ -649,6 +725,9 @@ export declare const RESPONSE_PAYLOAD_SCHEMA: {
|
|
|
649
725
|
readonly $ref: "#/$defs/ProfileEntry";
|
|
650
726
|
};
|
|
651
727
|
};
|
|
728
|
+
readonly reach: {
|
|
729
|
+
readonly $ref: "#/$defs/FaceReach";
|
|
730
|
+
};
|
|
652
731
|
readonly status: {
|
|
653
732
|
readonly type: "string";
|
|
654
733
|
readonly enum: readonly ["active", "retired"];
|
|
@@ -682,6 +761,39 @@ export declare const RESPONSE_PAYLOAD_SCHEMA: {
|
|
|
682
761
|
};
|
|
683
762
|
};
|
|
684
763
|
};
|
|
764
|
+
readonly FaceReach: {
|
|
765
|
+
readonly title: "FaceReach";
|
|
766
|
+
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.";
|
|
767
|
+
readonly oneOf: readonly [{
|
|
768
|
+
readonly type: "object";
|
|
769
|
+
readonly additionalProperties: false;
|
|
770
|
+
readonly required: readonly ["kind"];
|
|
771
|
+
readonly properties: {
|
|
772
|
+
readonly kind: {
|
|
773
|
+
readonly const: "anywhere";
|
|
774
|
+
};
|
|
775
|
+
};
|
|
776
|
+
}, {
|
|
777
|
+
readonly type: "object";
|
|
778
|
+
readonly additionalProperties: false;
|
|
779
|
+
readonly required: readonly ["kind", "contextIds"];
|
|
780
|
+
readonly properties: {
|
|
781
|
+
readonly kind: {
|
|
782
|
+
readonly const: "only";
|
|
783
|
+
};
|
|
784
|
+
readonly contextIds: {
|
|
785
|
+
readonly type: "array";
|
|
786
|
+
readonly minItems: 1;
|
|
787
|
+
readonly maxItems: 256;
|
|
788
|
+
readonly uniqueItems: true;
|
|
789
|
+
readonly items: {
|
|
790
|
+
readonly type: "string";
|
|
791
|
+
readonly minLength: 1;
|
|
792
|
+
};
|
|
793
|
+
};
|
|
794
|
+
};
|
|
795
|
+
}];
|
|
796
|
+
};
|
|
685
797
|
readonly ProfileEntry: {
|
|
686
798
|
readonly title: "ProfileEntry";
|
|
687
799
|
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.";
|
|
@@ -912,7 +1024,7 @@ export declare const SPEC: {
|
|
|
912
1024
|
};
|
|
913
1025
|
readonly Provenance: {
|
|
914
1026
|
readonly title: "Provenance";
|
|
915
|
-
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.";
|
|
1027
|
+
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.";
|
|
916
1028
|
readonly type: "object";
|
|
917
1029
|
readonly required: readonly ["kind"];
|
|
918
1030
|
readonly oneOf: readonly [{
|
|
@@ -969,6 +1081,26 @@ export declare const SPEC: {
|
|
|
969
1081
|
readonly description: "When true (the default and the only useful setting), a distinct value is minted for each verifier.";
|
|
970
1082
|
};
|
|
971
1083
|
};
|
|
1084
|
+
}, {
|
|
1085
|
+
readonly additionalProperties: false;
|
|
1086
|
+
readonly required: readonly ["kind", "source", "derivedAt"];
|
|
1087
|
+
readonly properties: {
|
|
1088
|
+
readonly kind: {
|
|
1089
|
+
readonly const: "derived";
|
|
1090
|
+
};
|
|
1091
|
+
readonly source: {
|
|
1092
|
+
readonly type: "string";
|
|
1093
|
+
readonly minLength: 1;
|
|
1094
|
+
readonly maxLength: 64;
|
|
1095
|
+
readonly pattern: "^[a-z][A-Za-z0-9.-]*$";
|
|
1096
|
+
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.";
|
|
1097
|
+
};
|
|
1098
|
+
readonly derivedAt: {
|
|
1099
|
+
readonly type: "string";
|
|
1100
|
+
readonly format: "date-time";
|
|
1101
|
+
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.";
|
|
1102
|
+
};
|
|
1103
|
+
};
|
|
972
1104
|
}];
|
|
973
1105
|
};
|
|
974
1106
|
readonly ProofRung: {
|
|
@@ -1026,6 +1158,9 @@ export declare const SPEC: {
|
|
|
1026
1158
|
readonly $ref: "#/$defs/ProfileEntry";
|
|
1027
1159
|
};
|
|
1028
1160
|
};
|
|
1161
|
+
readonly reach: {
|
|
1162
|
+
readonly $ref: "#/$defs/FaceReach";
|
|
1163
|
+
};
|
|
1029
1164
|
readonly status: {
|
|
1030
1165
|
readonly type: "string";
|
|
1031
1166
|
readonly enum: readonly ["active", "retired"];
|
|
@@ -1059,6 +1194,39 @@ export declare const SPEC: {
|
|
|
1059
1194
|
};
|
|
1060
1195
|
};
|
|
1061
1196
|
};
|
|
1197
|
+
readonly FaceReach: {
|
|
1198
|
+
readonly title: "FaceReach";
|
|
1199
|
+
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.";
|
|
1200
|
+
readonly oneOf: readonly [{
|
|
1201
|
+
readonly type: "object";
|
|
1202
|
+
readonly additionalProperties: false;
|
|
1203
|
+
readonly required: readonly ["kind"];
|
|
1204
|
+
readonly properties: {
|
|
1205
|
+
readonly kind: {
|
|
1206
|
+
readonly const: "anywhere";
|
|
1207
|
+
};
|
|
1208
|
+
};
|
|
1209
|
+
}, {
|
|
1210
|
+
readonly type: "object";
|
|
1211
|
+
readonly additionalProperties: false;
|
|
1212
|
+
readonly required: readonly ["kind", "contextIds"];
|
|
1213
|
+
readonly properties: {
|
|
1214
|
+
readonly kind: {
|
|
1215
|
+
readonly const: "only";
|
|
1216
|
+
};
|
|
1217
|
+
readonly contextIds: {
|
|
1218
|
+
readonly type: "array";
|
|
1219
|
+
readonly minItems: 1;
|
|
1220
|
+
readonly maxItems: 256;
|
|
1221
|
+
readonly uniqueItems: true;
|
|
1222
|
+
readonly items: {
|
|
1223
|
+
readonly type: "string";
|
|
1224
|
+
readonly minLength: 1;
|
|
1225
|
+
};
|
|
1226
|
+
};
|
|
1227
|
+
};
|
|
1228
|
+
}];
|
|
1229
|
+
};
|
|
1062
1230
|
readonly ProfileEntry: {
|
|
1063
1231
|
readonly title: "ProfileEntry";
|
|
1064
1232
|
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.";
|
|
@@ -1271,7 +1439,7 @@ export declare const RESPONSE_SPEC: {
|
|
|
1271
1439
|
};
|
|
1272
1440
|
readonly Provenance: {
|
|
1273
1441
|
readonly title: "Provenance";
|
|
1274
|
-
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.";
|
|
1442
|
+
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.";
|
|
1275
1443
|
readonly type: "object";
|
|
1276
1444
|
readonly required: readonly ["kind"];
|
|
1277
1445
|
readonly oneOf: readonly [{
|
|
@@ -1328,6 +1496,26 @@ export declare const RESPONSE_SPEC: {
|
|
|
1328
1496
|
readonly description: "When true (the default and the only useful setting), a distinct value is minted for each verifier.";
|
|
1329
1497
|
};
|
|
1330
1498
|
};
|
|
1499
|
+
}, {
|
|
1500
|
+
readonly additionalProperties: false;
|
|
1501
|
+
readonly required: readonly ["kind", "source", "derivedAt"];
|
|
1502
|
+
readonly properties: {
|
|
1503
|
+
readonly kind: {
|
|
1504
|
+
readonly const: "derived";
|
|
1505
|
+
};
|
|
1506
|
+
readonly source: {
|
|
1507
|
+
readonly type: "string";
|
|
1508
|
+
readonly minLength: 1;
|
|
1509
|
+
readonly maxLength: 64;
|
|
1510
|
+
readonly pattern: "^[a-z][A-Za-z0-9.-]*$";
|
|
1511
|
+
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.";
|
|
1512
|
+
};
|
|
1513
|
+
readonly derivedAt: {
|
|
1514
|
+
readonly type: "string";
|
|
1515
|
+
readonly format: "date-time";
|
|
1516
|
+
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.";
|
|
1517
|
+
};
|
|
1518
|
+
};
|
|
1331
1519
|
}];
|
|
1332
1520
|
};
|
|
1333
1521
|
readonly ProofRung: {
|
|
@@ -1385,6 +1573,9 @@ export declare const RESPONSE_SPEC: {
|
|
|
1385
1573
|
readonly $ref: "#/$defs/ProfileEntry";
|
|
1386
1574
|
};
|
|
1387
1575
|
};
|
|
1576
|
+
readonly reach: {
|
|
1577
|
+
readonly $ref: "#/$defs/FaceReach";
|
|
1578
|
+
};
|
|
1388
1579
|
readonly status: {
|
|
1389
1580
|
readonly type: "string";
|
|
1390
1581
|
readonly enum: readonly ["active", "retired"];
|
|
@@ -1418,6 +1609,39 @@ export declare const RESPONSE_SPEC: {
|
|
|
1418
1609
|
};
|
|
1419
1610
|
};
|
|
1420
1611
|
};
|
|
1612
|
+
readonly FaceReach: {
|
|
1613
|
+
readonly title: "FaceReach";
|
|
1614
|
+
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.";
|
|
1615
|
+
readonly oneOf: readonly [{
|
|
1616
|
+
readonly type: "object";
|
|
1617
|
+
readonly additionalProperties: false;
|
|
1618
|
+
readonly required: readonly ["kind"];
|
|
1619
|
+
readonly properties: {
|
|
1620
|
+
readonly kind: {
|
|
1621
|
+
readonly const: "anywhere";
|
|
1622
|
+
};
|
|
1623
|
+
};
|
|
1624
|
+
}, {
|
|
1625
|
+
readonly type: "object";
|
|
1626
|
+
readonly additionalProperties: false;
|
|
1627
|
+
readonly required: readonly ["kind", "contextIds"];
|
|
1628
|
+
readonly properties: {
|
|
1629
|
+
readonly kind: {
|
|
1630
|
+
readonly const: "only";
|
|
1631
|
+
};
|
|
1632
|
+
readonly contextIds: {
|
|
1633
|
+
readonly type: "array";
|
|
1634
|
+
readonly minItems: 1;
|
|
1635
|
+
readonly maxItems: 256;
|
|
1636
|
+
readonly uniqueItems: true;
|
|
1637
|
+
readonly items: {
|
|
1638
|
+
readonly type: "string";
|
|
1639
|
+
readonly minLength: 1;
|
|
1640
|
+
};
|
|
1641
|
+
};
|
|
1642
|
+
};
|
|
1643
|
+
}];
|
|
1644
|
+
};
|
|
1421
1645
|
readonly ProfileEntry: {
|
|
1422
1646
|
readonly title: "ProfileEntry";
|
|
1423
1647
|
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.";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../../../../src/persona/profile/get/1.0/payload.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,mBAAmB,IAAI,OAAO,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../../../../src/persona/profile/get/1.0/payload.ts"],"names":[],"mappings":"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"}
|
|
@@ -164,7 +164,7 @@ export const PAYLOAD_SCHEMA = {
|
|
|
164
164
|
},
|
|
165
165
|
"Provenance": {
|
|
166
166
|
"title": "Provenance",
|
|
167
|
-
"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.",
|
|
167
|
+
"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.",
|
|
168
168
|
"type": "object",
|
|
169
169
|
"required": [
|
|
170
170
|
"kind"
|
|
@@ -235,6 +235,31 @@ export const PAYLOAD_SCHEMA = {
|
|
|
235
235
|
"description": "When true (the default and the only useful setting), a distinct value is minted for each verifier."
|
|
236
236
|
}
|
|
237
237
|
}
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"additionalProperties": false,
|
|
241
|
+
"required": [
|
|
242
|
+
"kind",
|
|
243
|
+
"source",
|
|
244
|
+
"derivedAt"
|
|
245
|
+
],
|
|
246
|
+
"properties": {
|
|
247
|
+
"kind": {
|
|
248
|
+
"const": "derived"
|
|
249
|
+
},
|
|
250
|
+
"source": {
|
|
251
|
+
"type": "string",
|
|
252
|
+
"minLength": 1,
|
|
253
|
+
"maxLength": 64,
|
|
254
|
+
"pattern": "^[a-z][A-Za-z0-9.-]*$",
|
|
255
|
+
"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."
|
|
256
|
+
},
|
|
257
|
+
"derivedAt": {
|
|
258
|
+
"type": "string",
|
|
259
|
+
"format": "date-time",
|
|
260
|
+
"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."
|
|
261
|
+
}
|
|
262
|
+
}
|
|
238
263
|
}
|
|
239
264
|
]
|
|
240
265
|
},
|
|
@@ -310,6 +335,9 @@ export const PAYLOAD_SCHEMA = {
|
|
|
310
335
|
"$ref": "#/$defs/ProfileEntry"
|
|
311
336
|
}
|
|
312
337
|
},
|
|
338
|
+
"reach": {
|
|
339
|
+
"$ref": "#/$defs/FaceReach"
|
|
340
|
+
},
|
|
313
341
|
"status": {
|
|
314
342
|
"type": "string",
|
|
315
343
|
"enum": [
|
|
@@ -346,6 +374,47 @@ export const PAYLOAD_SCHEMA = {
|
|
|
346
374
|
}
|
|
347
375
|
}
|
|
348
376
|
},
|
|
377
|
+
"FaceReach": {
|
|
378
|
+
"title": "FaceReach",
|
|
379
|
+
"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.",
|
|
380
|
+
"oneOf": [
|
|
381
|
+
{
|
|
382
|
+
"type": "object",
|
|
383
|
+
"additionalProperties": false,
|
|
384
|
+
"required": [
|
|
385
|
+
"kind"
|
|
386
|
+
],
|
|
387
|
+
"properties": {
|
|
388
|
+
"kind": {
|
|
389
|
+
"const": "anywhere"
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
"type": "object",
|
|
395
|
+
"additionalProperties": false,
|
|
396
|
+
"required": [
|
|
397
|
+
"kind",
|
|
398
|
+
"contextIds"
|
|
399
|
+
],
|
|
400
|
+
"properties": {
|
|
401
|
+
"kind": {
|
|
402
|
+
"const": "only"
|
|
403
|
+
},
|
|
404
|
+
"contextIds": {
|
|
405
|
+
"type": "array",
|
|
406
|
+
"minItems": 1,
|
|
407
|
+
"maxItems": 256,
|
|
408
|
+
"uniqueItems": true,
|
|
409
|
+
"items": {
|
|
410
|
+
"type": "string",
|
|
411
|
+
"minLength": 1
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
]
|
|
417
|
+
},
|
|
349
418
|
"ProfileEntry": {
|
|
350
419
|
"title": "ProfileEntry",
|
|
351
420
|
"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.",
|
|
@@ -584,7 +653,7 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
|
|
|
584
653
|
},
|
|
585
654
|
"Provenance": {
|
|
586
655
|
"title": "Provenance",
|
|
587
|
-
"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.",
|
|
656
|
+
"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.",
|
|
588
657
|
"type": "object",
|
|
589
658
|
"required": [
|
|
590
659
|
"kind"
|
|
@@ -655,6 +724,31 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
|
|
|
655
724
|
"description": "When true (the default and the only useful setting), a distinct value is minted for each verifier."
|
|
656
725
|
}
|
|
657
726
|
}
|
|
727
|
+
},
|
|
728
|
+
{
|
|
729
|
+
"additionalProperties": false,
|
|
730
|
+
"required": [
|
|
731
|
+
"kind",
|
|
732
|
+
"source",
|
|
733
|
+
"derivedAt"
|
|
734
|
+
],
|
|
735
|
+
"properties": {
|
|
736
|
+
"kind": {
|
|
737
|
+
"const": "derived"
|
|
738
|
+
},
|
|
739
|
+
"source": {
|
|
740
|
+
"type": "string",
|
|
741
|
+
"minLength": 1,
|
|
742
|
+
"maxLength": 64,
|
|
743
|
+
"pattern": "^[a-z][A-Za-z0-9.-]*$",
|
|
744
|
+
"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."
|
|
745
|
+
},
|
|
746
|
+
"derivedAt": {
|
|
747
|
+
"type": "string",
|
|
748
|
+
"format": "date-time",
|
|
749
|
+
"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."
|
|
750
|
+
}
|
|
751
|
+
}
|
|
658
752
|
}
|
|
659
753
|
]
|
|
660
754
|
},
|
|
@@ -730,6 +824,9 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
|
|
|
730
824
|
"$ref": "#/$defs/ProfileEntry"
|
|
731
825
|
}
|
|
732
826
|
},
|
|
827
|
+
"reach": {
|
|
828
|
+
"$ref": "#/$defs/FaceReach"
|
|
829
|
+
},
|
|
733
830
|
"status": {
|
|
734
831
|
"type": "string",
|
|
735
832
|
"enum": [
|
|
@@ -766,6 +863,47 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
|
|
|
766
863
|
}
|
|
767
864
|
}
|
|
768
865
|
},
|
|
866
|
+
"FaceReach": {
|
|
867
|
+
"title": "FaceReach",
|
|
868
|
+
"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.",
|
|
869
|
+
"oneOf": [
|
|
870
|
+
{
|
|
871
|
+
"type": "object",
|
|
872
|
+
"additionalProperties": false,
|
|
873
|
+
"required": [
|
|
874
|
+
"kind"
|
|
875
|
+
],
|
|
876
|
+
"properties": {
|
|
877
|
+
"kind": {
|
|
878
|
+
"const": "anywhere"
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
},
|
|
882
|
+
{
|
|
883
|
+
"type": "object",
|
|
884
|
+
"additionalProperties": false,
|
|
885
|
+
"required": [
|
|
886
|
+
"kind",
|
|
887
|
+
"contextIds"
|
|
888
|
+
],
|
|
889
|
+
"properties": {
|
|
890
|
+
"kind": {
|
|
891
|
+
"const": "only"
|
|
892
|
+
},
|
|
893
|
+
"contextIds": {
|
|
894
|
+
"type": "array",
|
|
895
|
+
"minItems": 1,
|
|
896
|
+
"maxItems": 256,
|
|
897
|
+
"uniqueItems": true,
|
|
898
|
+
"items": {
|
|
899
|
+
"type": "string",
|
|
900
|
+
"minLength": 1
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
]
|
|
906
|
+
},
|
|
769
907
|
"ProfileEntry": {
|
|
770
908
|
"title": "ProfileEntry",
|
|
771
909
|
"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.",
|