@openvtc/trust-tasks 0.28.12 → 0.28.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/dist/_shared/components.d.ts +458 -0
  3. package/dist/_shared/components.d.ts.map +1 -1
  4. package/dist/index.d.ts +43 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +43 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/process-attestation/0.1/payload.d.ts +73 -7
  9. package/dist/process-attestation/0.1/payload.d.ts.map +1 -1
  10. package/dist/process-attestation/0.1/payload.js +40 -6
  11. package/dist/process-attestation/0.1/payload.js.map +1 -1
  12. package/dist/trust-task-discovery/0.1/payload.d.ts +4 -4
  13. package/dist/trust-task-discovery/0.1/payload.js +1 -1
  14. package/dist/trust-task-discovery/0.2/payload.d.ts +4 -4
  15. package/dist/trust-task-discovery/0.2/payload.js +1 -1
  16. package/dist/trust-task-discovery/0.3/payload.d.ts +14 -2
  17. package/dist/trust-task-discovery/0.3/payload.d.ts.map +1 -1
  18. package/dist/trust-task-discovery/0.3/payload.js +1 -1
  19. package/dist/trust-task-discovery/0.3/payload.js.map +1 -1
  20. package/dist/trust-task-discovery/0.4/payload.d.ts +521 -0
  21. package/dist/trust-task-discovery/0.4/payload.d.ts.map +1 -0
  22. package/dist/trust-task-discovery/0.4/payload.js +266 -0
  23. package/dist/trust-task-discovery/0.4/payload.js.map +1 -0
  24. package/dist/vtc/boards/_shared/0.1/board.d.ts +22 -0
  25. package/dist/vtc/boards/_shared/0.1/board.d.ts.map +1 -0
  26. package/dist/vtc/boards/_shared/0.1/board.js +6 -0
  27. package/dist/vtc/boards/_shared/0.1/board.js.map +1 -0
  28. package/dist/vtc/boards/create/0.1/payload.d.ts +2402 -0
  29. package/dist/vtc/boards/create/0.1/payload.d.ts.map +1 -0
  30. package/dist/vtc/boards/create/0.1/payload.js +1349 -0
  31. package/dist/vtc/boards/create/0.1/payload.js.map +1 -0
  32. package/dist/vtc/boards/ideas/decide/0.1/payload.d.ts +1781 -0
  33. package/dist/vtc/boards/ideas/decide/0.1/payload.d.ts.map +1 -0
  34. package/dist/vtc/boards/ideas/decide/0.1/payload.js +1028 -0
  35. package/dist/vtc/boards/ideas/decide/0.1/payload.js.map +1 -0
  36. package/dist/vtc/boards/ideas/propose/0.1/payload.d.ts +1781 -0
  37. package/dist/vtc/boards/ideas/propose/0.1/payload.d.ts.map +1 -0
  38. package/dist/vtc/boards/ideas/propose/0.1/payload.js +1025 -0
  39. package/dist/vtc/boards/ideas/propose/0.1/payload.js.map +1 -0
  40. package/dist/vtc/boards/ideas/select/0.1/payload.d.ts +1788 -0
  41. package/dist/vtc/boards/ideas/select/0.1/payload.d.ts.map +1 -0
  42. package/dist/vtc/boards/ideas/select/0.1/payload.js +1029 -0
  43. package/dist/vtc/boards/ideas/select/0.1/payload.js.map +1 -0
  44. package/dist/vtc/boards/ideas/update/0.1/payload.d.ts +1781 -0
  45. package/dist/vtc/boards/ideas/update/0.1/payload.d.ts.map +1 -0
  46. package/dist/vtc/boards/ideas/update/0.1/payload.js +1023 -0
  47. package/dist/vtc/boards/ideas/update/0.1/payload.js.map +1 -0
  48. package/dist/vtc/boards/ideas/withdraw/0.1/payload.d.ts +1753 -0
  49. package/dist/vtc/boards/ideas/withdraw/0.1/payload.d.ts.map +1 -0
  50. package/dist/vtc/boards/ideas/withdraw/0.1/payload.js +1011 -0
  51. package/dist/vtc/boards/ideas/withdraw/0.1/payload.js.map +1 -0
  52. package/dist/vtc/boards/list/0.1/payload.d.ts +2267 -0
  53. package/dist/vtc/boards/list/0.1/payload.d.ts.map +1 -0
  54. package/dist/vtc/boards/list/0.1/payload.js +1326 -0
  55. package/dist/vtc/boards/list/0.1/payload.js.map +1 -0
  56. package/dist/vtc/boards/notes/add/0.1/payload.d.ts +655 -0
  57. package/dist/vtc/boards/notes/add/0.1/payload.d.ts.map +1 -0
  58. package/dist/vtc/boards/notes/add/0.1/payload.js +374 -0
  59. package/dist/vtc/boards/notes/add/0.1/payload.js.map +1 -0
  60. package/dist/vtc/boards/notes/hide/0.1/payload.d.ts +657 -0
  61. package/dist/vtc/boards/notes/hide/0.1/payload.d.ts.map +1 -0
  62. package/dist/vtc/boards/notes/hide/0.1/payload.js +378 -0
  63. package/dist/vtc/boards/notes/hide/0.1/payload.js.map +1 -0
  64. package/dist/vtc/boards/notes/list/0.1/payload.d.ts +730 -0
  65. package/dist/vtc/boards/notes/list/0.1/payload.d.ts.map +1 -0
  66. package/dist/vtc/boards/notes/list/0.1/payload.js +406 -0
  67. package/dist/vtc/boards/notes/list/0.1/payload.js.map +1 -0
  68. package/dist/vtc/boards/notes/withdraw/0.1/payload.d.ts +641 -0
  69. package/dist/vtc/boards/notes/withdraw/0.1/payload.d.ts.map +1 -0
  70. package/dist/vtc/boards/notes/withdraw/0.1/payload.js +367 -0
  71. package/dist/vtc/boards/notes/withdraw/0.1/payload.js.map +1 -0
  72. package/dist/vtc/boards/show/0.1/payload.d.ts +3713 -0
  73. package/dist/vtc/boards/show/0.1/payload.d.ts.map +1 -0
  74. package/dist/vtc/boards/show/0.1/payload.js +2160 -0
  75. package/dist/vtc/boards/show/0.1/payload.js.map +1 -0
  76. package/dist/vtc/boards/update/0.1/payload.d.ts +2423 -0
  77. package/dist/vtc/boards/update/0.1/payload.d.ts.map +1 -0
  78. package/dist/vtc/boards/update/0.1/payload.js +1356 -0
  79. package/dist/vtc/boards/update/0.1/payload.js.map +1 -0
  80. package/package.json +1 -1
  81. package/src/_shared/components.ts +493 -0
  82. package/src/index.ts +43 -0
  83. package/src/process-attestation/0.1/payload.ts +53 -9
  84. package/src/trust-task-discovery/0.1/payload.ts +5 -5
  85. package/src/trust-task-discovery/0.2/payload.ts +5 -5
  86. package/src/trust-task-discovery/0.3/payload.ts +15 -3
  87. package/src/trust-task-discovery/0.4/payload.ts +387 -0
  88. package/src/vtc/boards/_shared/0.1/board.ts +23 -0
  89. package/src/vtc/boards/create/0.1/payload.ts +1517 -0
  90. package/src/vtc/boards/ideas/decide/0.1/payload.ts +1068 -0
  91. package/src/vtc/boards/ideas/propose/0.1/payload.ts +1063 -0
  92. package/src/vtc/boards/ideas/select/0.1/payload.ts +1070 -0
  93. package/src/vtc/boards/ideas/update/0.1/payload.ts +1061 -0
  94. package/src/vtc/boards/ideas/withdraw/0.1/payload.ts +1045 -0
  95. package/src/vtc/boards/list/0.1/payload.ts +1376 -0
  96. package/src/vtc/boards/notes/add/0.1/payload.ts +410 -0
  97. package/src/vtc/boards/notes/hide/0.1/payload.ts +414 -0
  98. package/src/vtc/boards/notes/list/0.1/payload.ts +457 -0
  99. package/src/vtc/boards/notes/withdraw/0.1/payload.ts +401 -0
  100. package/src/vtc/boards/show/0.1/payload.ts +2212 -0
  101. package/src/vtc/boards/update/0.1/payload.ts +1529 -0
package/CHANGELOG.md CHANGED
@@ -11,6 +11,94 @@ The package versions over **its own API** — what a consumer compiles against
11
11
  not over `SPEC.md`. Below 1.0 a breaking change bumps the leading non-zero
12
12
  component.
13
13
 
14
+ ## 0.28.14 — 2026-11-04
15
+
16
+
17
+ ### Added
18
+
19
+ - **trust-task-discovery**: Publish 0.4, a responder advertises the horizon up to which it honours a stated expiresAt (#1030)
20
+
21
+ SPEC §7.2 (Bounding the record) applies a consumer's maximum age only where a
22
+ document states no expiresAt, and since trust-tasks-rs 0.37 (#1021)
23
+ validate_freshness does so, honouring a stated expiry up to the policy's
24
+ expiry_horizon. discovery 0.3 cannot describe that: its window "governs
25
+ issuedAt only" and its responder refuses any document past
26
+ issuedAt + maxAgeSeconds + clockSkewSeconds, whatever expiresAt it states. A
27
+ responder that honours an expiry could only advertise a narrower window than
28
+ it applies, and a producer could not learn that stating an expiry keeps a long
29
+ delivery acceptable.
30
+
31
+ - specs/trust-task-discovery/0.4: acceptanceWindow gains an optional
32
+ expiryHorizonSeconds (whole seconds, at least 1), and the spec defines a
33
+ document's acceptance end: issuedAt + maxAgeSeconds without an expiresAt;
34
+ the earlier of expiresAt and issuedAt + expiryHorizonSeconds with one; and,
35
+ where the window carries no horizon, the earlier of expiresAt and
36
+ issuedAt + maxAgeSeconds, which is what a 0.3 window says.
37
+ - Responder: MUST NOT advertise a horizon wider than it applies, nor one at
38
+ all if it applies its maximum age whatever expiresAt states.
39
+ - Discoverer: send bounds follow the acceptance end. MAY state an expiresAt
40
+ within the horizon, no later than it will pursue delivery, instead of
41
+ issuing a chain of new attempts; a new attempt carries it unchanged.
42
+ Absent a horizon, it MUST assume the maximum age applies to every
43
+ document.
44
+ - AcceptanceWindow is closed in 0.3, so an added optional member is a MINOR
45
+ increment (§5.2): a new version, not an edit.
46
+ - Response-side invalid examples: a zero horizon, a duration string, and a
47
+ fractional entry-level horizon.
48
+ - trust-tasks-rs: DiscoveryRegistry::respond_to_v0_4 is the current answer.
49
+ acceptance_window_from reads the policy's expiry_horizon, and
50
+ expiry_horizon() sets one by hand. respond_to_v0_3 moves to
51
+ discovery/superseded.rs and states the window without the horizon (narrower
52
+ than applied, which 0.3 permits).
53
+ - trust-tasks-https: enable_discovery answers 0.4, and 0.3 beside 0.2 and 0.1.
54
+ - trust-tasks-dart-https: enableDiscovery answers 0.4. Dart's FreshnessPolicy
55
+ has no horizon, so its window states none, which says the maximum age
56
+ applies to every document. 0.3 moves to the superseded block.
57
+ - Examples and tests that named the 0.3 types use 0.4.
58
+ - Bindings regenerated (Rust, TS, Go, Dart). 0.3 is superseded.
59
+
60
+ Follows from #1021 and trustoverip/dtgwg-vti-spec#96 (VTI-OPS-024,
61
+ VTI-OPS-028, VTI-TRN-048), whose implementation in
62
+ OpenVTC/verifiable-trust-infrastructure states delivery deadlines as expiresAt.
63
+
64
+
65
+
66
+ ### Specifications
67
+
68
+ - **process-attestation**: Label WritersProof as the Holder, and check that an implementation's role names a party (#1029)
69
+
70
+ Follow-up to #994 and #997.
71
+
72
+ - process-attestation/0.1 lists WritersProof in the { url, role, name } form
73
+ #997 added, so the spec page shows which party it plays.
74
+ - The outcome-evidence rule says "a relying party MUST NOT", not "a consumer":
75
+ the rule binds whoever relies on the citing artifact, and "consumer" means a
76
+ document's recipient (SPEC §7.2).
77
+ - build-registry fails a knownImplementations role that names none of the
78
+ specification's parties and is not "both". The meta-schema can only bound it
79
+ as a string, and a typo would put an undefined party on the page.
80
+
81
+ - **process-attestation**: Declare outcome evidence, bind receipts by digest, add the CPoE profile (#994)
82
+
83
+ * spec(process-attestation): declare outcome evidence, bind receipts by digest, add the CPoE profile
84
+
85
+
86
+
87
+ ### Website
88
+
89
+ - Show a task's outcome evidence and size bound, and which party an implementation plays (#997)
90
+
91
+ * site: show a task's outcome evidence and size bound, and which party an implementation plays
92
+
93
+ ## 0.28.13 — 2026-11-04
94
+
95
+
96
+ ### Added
97
+
98
+ - **vtc/boards**: Community boards — propose ideas, leave notes, vote on each accepted idea through its own election (vtc/boards/*/0.1) (#1025)
99
+
100
+ Thirteen tasks implementing the VTI Community Boards chapter (VTI-BRD-001 – VTI-BRD-080): create, update, list and show a board; propose, update, withdraw, decide (accept opens an election from the board's template) and select ideas; add, list, withdraw and hide notes. A board never reports tickets or ballots (VTI-BRD-033); the shared ElectionTemplate is a manifest less the members the community fills in per idea, and is never binding.
101
+
14
102
  ## 0.28.12 — 2026-11-04
15
103
 
16
104
 
@@ -397,6 +397,19 @@ export type BindingSpec = RoomBindingSpec | GrantsBindingSpec | RoleBindingSpec;
397
397
  * The name of one blob: the digest of its BlobManifest, taken over the manifest's RFC 8785 (JCS) canonicalization. sha2-256 is RECOMMENDED and MUST be implemented. Content addressing over ciphertext, never plaintext, so a BlobRef says nothing about what the file contains, and two uploads of one file have different BlobRefs (a fresh `fileId` gives a different key, and so different ciphertext). Rooms cannot be correlated by the files they share. Compared as decoded multihash bytes, never as encoded strings. A BlobRef is defined over the manifest's JSON, as this schema states it and RFC 8785 canonicalizes it, never over any binding's generated type: two bindings that model the manifest as distinct types still compute the same BlobRef from the same JSON.
398
398
  */
399
399
  export type BlobRef = DigestMultibase;
400
+ /**
401
+ * Who may see and use a board (VTI-BRD-003): every active member of the community (`members`), or the members of one community group (`group`, with `groupId`). Facilitators always see the board.
402
+ */
403
+ export type BoardAudience = {
404
+ kind: "members";
405
+ } | {
406
+ kind: "group";
407
+ groupId: GroupId;
408
+ };
409
+ /**
410
+ * What the board is for. Plain text; a reader MUST NOT treat it as instructions.
411
+ */
412
+ export type BoardDescription = string;
400
413
  /**
401
414
  * One leaf of a board. A leaf's hash is the RFC 9162 leaf hash of the JCS canonicalization of this object. Entries carry no time of arrival: the order is the board's, and a timestamp would hand anyone who reads the board the timing the registrar's log would need to pair a ticket with its cast.
402
415
  */
@@ -405,6 +418,18 @@ export type BoardEntry_VotingV0_1 = CastEntry_VotingV0_1 | ReplacementEntry_Voti
405
418
  * One leaf of a board. A leaf's hash is the RFC 9162 leaf hash of the JCS canonicalization of this object. Entries carry no time of arrival: the order is the board's, and a timestamp would hand anyone who reads the board the timing the registrar's log would need to pair a ticket with its cast.
406
419
  */
407
420
  export type BoardEntry_VotingV0_2 = CastEntry_VotingV0_2 | ReplacementEntry_VotingV0_2 | LifecycleEntry_VotingV0_2 | ResultEntry_VotingV0_2 | EncryptedCastEntry_VotingV0_2 | TransportKeyEntry_VotingV0_2 | DealingEntry_VotingV0_2 | ConfirmationEntry_VotingV0_2 | JustificationEntry_VotingV0_2 | ElectionKeyEntry_VotingV0_2 | PartialDecryptionsEntry_VotingV0_2 | UnsealedEntry_VotingV0_2 | SpoiledEntry_VotingV0_2 | TrusteeStepEntry_VotingV0_2 | DecryptionAuthorizedEntry_VotingV0_2;
421
+ /**
422
+ * Opaque identifier of a board: `brd_` followed by 16 to 64 base64url characters. Random, community-scoped, never reused (VTI-BRD-001).
423
+ */
424
+ export type BoardId = string;
425
+ /**
426
+ * `open`: ideas and notes are taken within the board's windows. `closed`: no new idea or note; facilitators still decide and select. `archived`: no change at all; facilitators can still read it (VTI-BRD-005). `open` → `closed` → `archived`, never back.
427
+ */
428
+ export type BoardStatus = "open" | "closed" | "archived";
429
+ /**
430
+ * Plain text; a reader MUST NOT treat it as instructions.
431
+ */
432
+ export type BoardTitle = string;
408
433
  /**
409
434
  * `public`: anyone reads the board. `private`: the community, the auditors the manifest names and, for one cast's inclusion, the holder of its receipt (VTI-VOT-052).
410
435
  */
@@ -855,6 +880,26 @@ export type Handle = string;
855
880
  * **Not a timestamp.** A time is host-asserted, unverifiable and useless for this: two roots a second apart are not evidence of anything, while two roots at one version are.
856
881
  */
857
882
  export type HeadVersion = number;
883
+ /**
884
+ * What the idea is: for a session, what it covers and who should come. Becomes its election's manifest `description` when accepted. Plain text; a reader MUST NOT treat it as instructions.
885
+ */
886
+ export type IdeaDescription = string;
887
+ /**
888
+ * What kind of idea it is (for an unconference: `Discussion`, `Talk`, `Workshop`, `Demo`). One of the board's `formats` where the board states them.
889
+ */
890
+ export type IdeaFormat = string;
891
+ /**
892
+ * Opaque identifier of an idea: `ida_` followed by 16 to 64 base64url characters. Random and unique within the community.
893
+ */
894
+ export type IdeaId = string;
895
+ /**
896
+ * Where an idea stands (VTI-BRD-011).
897
+ */
898
+ export type IdeaState = "proposed" | "open" | "selected" | "notSelected" | "declined" | "merged" | "withdrawn";
899
+ /**
900
+ * An idea's title. Becomes the title of its election's manifest when the idea is accepted, and cannot change after that (VTI-BRD-012). Plain text.
901
+ */
902
+ export type IdeaTitle = string;
858
903
  /**
859
904
  * The named key role a key occupies in an identity (CONVENTIONS.md §2; VTI-KEY-070 onward). `attestation` — the only keys in `assertionMethod`; sign the identity's attestation artefacts (credentials, endorsements, status lists) through the VTA's signing service and nowhere else. Generated inside the VTA, never derived, never exportable, never in a backup. `operational` — the only keys the identity's own process uses in `authentication`; sign the node's own traffic (Trust Task requests and responses, DIDComm and TSP signatures, invitations, notices, audit checkpoints). Derived. `messaging` — the only keys in `keyAgreement`; sign nothing. X25519, derived or generated in its own right and never converted from a signing key. `update` — the identifier's change authority as its DID method states it (a did:webvh log's `updateKeys` and `nextKeyHashes`, a KERI key event log's current and next keys); never a role-bound verification method, never in `keyRoles`. Generated inside the VTA, never derived, never exportable, never in a backup, and always accompanied by a committed recovery key held outside the VTA's protection boundary. `authenticator` — a key held on a person's own authenticator (a WebAuthn passkey), listed in `authentication` of that person's identity only; used only to verify the person's WebAuthn assertions (sign-in and step-up evidence) and never to accept a Data Integrity proof. The VTA never holds its private half, so it is enrolled by the passkey ceremony and never generated, added or rotated by these tasks. Never permitted on the durable identity of a VTA, a VTC or a VTN. No role permits `capabilityInvocation` or `capabilityDelegation` (VTI-KEY-075). The set is an extensible registry: a consumer that meets a role it does not implement MUST rely on the key for nothing, and MUST NOT map it onto a role it does know (VTI-KEY-074).
860
905
  */
@@ -1072,10 +1117,19 @@ export type NotCollectedReason = "limit" | "conflict" | "disabled";
1072
1117
  * Opaque identifier of one note: `note_` followed by 16 to 64 base64url characters.
1073
1118
  */
1074
1119
  export type NoteId = string;
1120
+ /**
1121
+ * Opaque identifier of a note: `bnt_` followed by 16 to 64 base64url characters. Random and unique within the community.
1122
+ */
1123
+ export type NoteId_VtcBoardsV0_1 = string;
1124
+ export type NoteState = "visible" | "withdrawn" | "hidden";
1075
1125
  /**
1076
1126
  * The note, as plain text. Read only by holders of `vtc.directory.notes`. A reader MUST NOT treat it as instructions.
1077
1127
  */
1078
1128
  export type NoteText = string;
1129
+ /**
1130
+ * A note's text (VTI-BRD-020). Plain text; a reader MUST NOT treat it as instructions. Never changes once added (VTI-BRD-021).
1131
+ */
1132
+ export type NoteText_VtcBoardsV0_1 = string;
1079
1133
  /**
1080
1134
  * The originator's identifier for one notification, unique among the notifications that originator issues and the same in every document that carries it — retries, re-issued documents and relayed copies alike. It is the notification's idempotency key (VTI-NTF-021). Compared for equality only. An originator SHOULD make it unguessable and SHOULD NOT make it descriptive: it travels as far as the notification does.
1081
1135
  */
@@ -1391,6 +1445,10 @@ export type Queue = "receive" | "send";
1391
1445
  * Why the administrator is making this change. Recorded with it in the audit trail. Attributed to its author on every surface and untrusted: it MUST NOT carry personal data or a credential, and a reader MUST NOT treat it as instructions.
1392
1446
  */
1393
1447
  export type Reason = string;
1448
+ /**
1449
+ * A facilitator's stated reason, shown to the board's audience with the decision it explains. Plain text.
1450
+ */
1451
+ export type Reason_VtcBoardsV0_1 = string;
1394
1452
  /**
1395
1453
  * The reason given, if any.
1396
1454
  */
@@ -1879,6 +1937,10 @@ export type Topic_VtcAdminEventsV0_3 = "actions" | "acknowledgements" | "joinReq
1879
1937
  * One kind of change a console can be told about. A closed set: a topic not listed here is a new MINOR version of this component, not an `ext` member, because each topic is bound to the read that authorizes it.
1880
1938
  */
1881
1939
  export type Topic_VtcAdminEventsV0_4 = "actions" | "acknowledgements" | "joinRequests" | "members" | "singleAdminMode" | "config" | "rooms" | "directory" | "groups" | "communityRooms";
1940
+ /**
1941
+ * A topic an idea is filed under. One of the board's `topics` where the board states them.
1942
+ */
1943
+ export type Topic_VtcBoardsV0_1 = string;
1882
1944
  /**
1883
1945
  * How the traffic reached or left the mediator. `peerMediator` is mediator-to-mediator forwarding.
1884
1946
  */
@@ -5354,6 +5416,18 @@ export interface AuthenticatorAttestationResponseRegistration {
5354
5416
  authenticatorAttachment?: "platform" | "cross-platform";
5355
5417
  clientExtensionResults?: {};
5356
5418
  }
5419
+ /**
5420
+ * Who proposed an idea or wrote a note, as the board's audience sees them. `entryId` is their directory entry, which survives a rotation of their DID; `name` is their directory display name as this caller may see it, absent where the directory withholds it. A departed member is shown as `formerMember: true` with neither (VTI-BRD-060).
5421
+ */
5422
+ export interface Author {
5423
+ entryId?: EntryId;
5424
+ name?: string;
5425
+ formerMember?: true;
5426
+ /**
5427
+ * Present when the caller is the author.
5428
+ */
5429
+ you?: true;
5430
+ }
5357
5431
  /**
5358
5432
  * What a party presents to act on a room. Carries the whole authority chain: a host MUST NOT dereference an authority credential's `parent` to fetch a link it was not given. Resolving over the network would make verification depend on availability, turn every identifier into a request the host can be induced to make against an address the holder chooses, and signal credential use to whoever hosts the identifier. A host MUST bind the presenter to the chain's leaf. A chain that verifies is evidence that authority was conferred on somebody; it is not evidence that the party presenting it is that somebody. The leaf's subject MUST equal the party the host authenticated for this request — an identity the transport established or a document `proof` proved, never one named in a payload. A host that omits this check authorizes every captured presentation, and the omission is silent, because the chain still verifies.
5359
5433
  *
@@ -5500,6 +5574,160 @@ export interface BlobManifest {
5500
5574
  */
5501
5575
  digest: DigestMultibase;
5502
5576
  }
5577
+ /**
5578
+ * A board as one caller may see it.
5579
+ */
5580
+ export interface Board {
5581
+ boardId: BoardId;
5582
+ title: BoardTitle;
5583
+ description?: BoardDescription;
5584
+ status: BoardStatus;
5585
+ audience: BoardAudience;
5586
+ /**
5587
+ * When ideas are taken (VTI-BRD-010).
5588
+ */
5589
+ proposals: Window;
5590
+ /**
5591
+ * When every idea's election takes ballots. Opens after `proposals` opens and closes after it closes (VTI-BRD-001).
5592
+ */
5593
+ voting: Window;
5594
+ /**
5595
+ * @maxItems 32
5596
+ */
5597
+ topics?: Topic_VtcBoardsV0_1[];
5598
+ /**
5599
+ * @maxItems 16
5600
+ */
5601
+ formats?: [] | [IdeaFormat] | [IdeaFormat, IdeaFormat] | [IdeaFormat, IdeaFormat, IdeaFormat] | [IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat] | [IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat] | [IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat] | [IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat] | [IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat] | [IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat, IdeaFormat] | [
5602
+ IdeaFormat,
5603
+ IdeaFormat,
5604
+ IdeaFormat,
5605
+ IdeaFormat,
5606
+ IdeaFormat,
5607
+ IdeaFormat,
5608
+ IdeaFormat,
5609
+ IdeaFormat,
5610
+ IdeaFormat,
5611
+ IdeaFormat
5612
+ ] | [
5613
+ IdeaFormat,
5614
+ IdeaFormat,
5615
+ IdeaFormat,
5616
+ IdeaFormat,
5617
+ IdeaFormat,
5618
+ IdeaFormat,
5619
+ IdeaFormat,
5620
+ IdeaFormat,
5621
+ IdeaFormat,
5622
+ IdeaFormat,
5623
+ IdeaFormat
5624
+ ] | [
5625
+ IdeaFormat,
5626
+ IdeaFormat,
5627
+ IdeaFormat,
5628
+ IdeaFormat,
5629
+ IdeaFormat,
5630
+ IdeaFormat,
5631
+ IdeaFormat,
5632
+ IdeaFormat,
5633
+ IdeaFormat,
5634
+ IdeaFormat,
5635
+ IdeaFormat,
5636
+ IdeaFormat
5637
+ ] | [
5638
+ IdeaFormat,
5639
+ IdeaFormat,
5640
+ IdeaFormat,
5641
+ IdeaFormat,
5642
+ IdeaFormat,
5643
+ IdeaFormat,
5644
+ IdeaFormat,
5645
+ IdeaFormat,
5646
+ IdeaFormat,
5647
+ IdeaFormat,
5648
+ IdeaFormat,
5649
+ IdeaFormat,
5650
+ IdeaFormat
5651
+ ] | [
5652
+ IdeaFormat,
5653
+ IdeaFormat,
5654
+ IdeaFormat,
5655
+ IdeaFormat,
5656
+ IdeaFormat,
5657
+ IdeaFormat,
5658
+ IdeaFormat,
5659
+ IdeaFormat,
5660
+ IdeaFormat,
5661
+ IdeaFormat,
5662
+ IdeaFormat,
5663
+ IdeaFormat,
5664
+ IdeaFormat,
5665
+ IdeaFormat
5666
+ ] | [
5667
+ IdeaFormat,
5668
+ IdeaFormat,
5669
+ IdeaFormat,
5670
+ IdeaFormat,
5671
+ IdeaFormat,
5672
+ IdeaFormat,
5673
+ IdeaFormat,
5674
+ IdeaFormat,
5675
+ IdeaFormat,
5676
+ IdeaFormat,
5677
+ IdeaFormat,
5678
+ IdeaFormat,
5679
+ IdeaFormat,
5680
+ IdeaFormat,
5681
+ IdeaFormat
5682
+ ] | [
5683
+ IdeaFormat,
5684
+ IdeaFormat,
5685
+ IdeaFormat,
5686
+ IdeaFormat,
5687
+ IdeaFormat,
5688
+ IdeaFormat,
5689
+ IdeaFormat,
5690
+ IdeaFormat,
5691
+ IdeaFormat,
5692
+ IdeaFormat,
5693
+ IdeaFormat,
5694
+ IdeaFormat,
5695
+ IdeaFormat,
5696
+ IdeaFormat,
5697
+ IdeaFormat,
5698
+ IdeaFormat
5699
+ ];
5700
+ /**
5701
+ * The most ideas one member may have on the board that are not `withdrawn` or `declined`. Absent: no limit beyond the community's own.
5702
+ */
5703
+ maxIdeasPerMember?: number;
5704
+ /**
5705
+ * How facilitators intend to select, in plain words (VTI-BRD-041), e.g. "The twelve ideas the most members would attend".
5706
+ */
5707
+ selectionRule?: string;
5708
+ /**
5709
+ * @maxItems 256
5710
+ */
5711
+ timetable?: Slot_VtcBoardsV0_1[];
5712
+ template: ElectionTemplate;
5713
+ createdAt: string;
5714
+ /**
5715
+ * Whether the caller facilitates this board.
5716
+ */
5717
+ facilitator: boolean;
5718
+ /**
5719
+ * How many of the board's ideas are in each state the caller may see.
5720
+ */
5721
+ ideaCounts: {
5722
+ proposed?: number;
5723
+ open?: number;
5724
+ selected?: number;
5725
+ notSelected?: number;
5726
+ declined?: number;
5727
+ merged?: number;
5728
+ withdrawn?: number;
5729
+ };
5730
+ }
5503
5731
  export interface CastEntry_VotingV0_1 {
5504
5732
  kind: "cast";
5505
5733
  cast: Cast;
@@ -8126,6 +8354,114 @@ export interface ElectionSummary {
8126
8354
  ballotsAdmitted: number;
8127
8355
  head: BoardHead;
8128
8356
  }
8357
+ /**
8358
+ * Every member of an idea's election manifest that the board fixes (VTI-BRD-030). When a facilitator accepts an idea the community completes it: `electionId` (naming the board and the idea), `community`, `title` and `description` from the idea, `registrationOpensAt` and `votingOpensAt` from the board's voting window's `opensAt` or the acceptance, whichever is later, `votingClosesAt` from its `closesAt`, `roll` from the board's audience (rule `members`, or a credential roll naming the group), and `binding: false`. A board's template is never binding, and so has no `binding` member.
8359
+ */
8360
+ export interface ElectionTemplate {
8361
+ /**
8362
+ * @minItems 1
8363
+ * @maxItems 16
8364
+ */
8365
+ questions: [Question] | [Question, Question] | [Question, Question, Question] | [Question, Question, Question, Question] | [Question, Question, Question, Question, Question] | [Question, Question, Question, Question, Question, Question] | [Question, Question, Question, Question, Question, Question, Question] | [Question, Question, Question, Question, Question, Question, Question, Question] | [Question, Question, Question, Question, Question, Question, Question, Question, Question] | [Question, Question, Question, Question, Question, Question, Question, Question, Question, Question] | [Question, Question, Question, Question, Question, Question, Question, Question, Question, Question, Question] | [
8366
+ Question,
8367
+ Question,
8368
+ Question,
8369
+ Question,
8370
+ Question,
8371
+ Question,
8372
+ Question,
8373
+ Question,
8374
+ Question,
8375
+ Question,
8376
+ Question,
8377
+ Question
8378
+ ] | [
8379
+ Question,
8380
+ Question,
8381
+ Question,
8382
+ Question,
8383
+ Question,
8384
+ Question,
8385
+ Question,
8386
+ Question,
8387
+ Question,
8388
+ Question,
8389
+ Question,
8390
+ Question,
8391
+ Question
8392
+ ] | [
8393
+ Question,
8394
+ Question,
8395
+ Question,
8396
+ Question,
8397
+ Question,
8398
+ Question,
8399
+ Question,
8400
+ Question,
8401
+ Question,
8402
+ Question,
8403
+ Question,
8404
+ Question,
8405
+ Question,
8406
+ Question
8407
+ ] | [
8408
+ Question,
8409
+ Question,
8410
+ Question,
8411
+ Question,
8412
+ Question,
8413
+ Question,
8414
+ Question,
8415
+ Question,
8416
+ Question,
8417
+ Question,
8418
+ Question,
8419
+ Question,
8420
+ Question,
8421
+ Question,
8422
+ Question
8423
+ ] | [
8424
+ Question,
8425
+ Question,
8426
+ Question,
8427
+ Question,
8428
+ Question,
8429
+ Question,
8430
+ Question,
8431
+ Question,
8432
+ Question,
8433
+ Question,
8434
+ Question,
8435
+ Question,
8436
+ Question,
8437
+ Question,
8438
+ Question,
8439
+ Question
8440
+ ];
8441
+ secrecy: SecrecyLevel;
8442
+ revote: Revote;
8443
+ /**
8444
+ * The ballot box's board for each idea's election, as a manifest states it (VTI-VOT-052). `public` lets a board show each idea's ballot count while voting is open (VTI-BRD-033).
8445
+ */
8446
+ board: {
8447
+ visibility: BoardVisibility;
8448
+ auditors: string[];
8449
+ };
8450
+ /**
8451
+ * The DID of the voting service every idea's election is registered with; one on the community's list (VTI-VOT-082).
8452
+ */
8453
+ ballotBox: string;
8454
+ trustees?: Trustees;
8455
+ allowEarlyClose: boolean;
8456
+ /**
8457
+ * Open elections only: whether running totals may be read while voting is open (VTI-VOT-061). A board SHOULD set it false (VTI-BRD-033).
8458
+ */
8459
+ resultsBeforeClose: boolean;
8460
+ /**
8461
+ * Counted ballots required before any text answer is disclosed (VTI-VOT-065); SHOULD be at least 10.
8462
+ */
8463
+ textReleaseThreshold: number;
8464
+ }
8129
8465
  /**
8130
8466
  * A tallied-encrypted ballot: one EncryptedQuestion per manifest question, in the manifest's order. Never decrypted (VTI-VOT-064).
8131
8467
  */
@@ -9172,6 +9508,93 @@ export interface HpkeArmoredEnvelope_VaultV0_2 {
9172
9508
  */
9173
9509
  producerAssertion?: "didSigned" | "attested" | "pinnedOnly";
9174
9510
  }
9511
+ /**
9512
+ * An idea as one caller may see it.
9513
+ */
9514
+ export interface Idea {
9515
+ ideaId: IdeaId;
9516
+ boardId: BoardId;
9517
+ state: IdeaState;
9518
+ title: IdeaTitle;
9519
+ description: IdeaDescription;
9520
+ format?: IdeaFormat;
9521
+ topic?: Topic_VtcBoardsV0_1;
9522
+ proposer: Author;
9523
+ proposedAt: string;
9524
+ /**
9525
+ * Notes on the idea the caller may read.
9526
+ */
9527
+ noteCount: number;
9528
+ /**
9529
+ * Present once an election was opened for the idea.
9530
+ */
9531
+ election?: IdeaElection;
9532
+ opening?: IdeaOpening;
9533
+ /**
9534
+ * Present in `declined`, `merged`, `selected` and `notSelected`.
9535
+ */
9536
+ decision?: IdeaDecision;
9537
+ }
9538
+ /**
9539
+ * A facilitator's decision on an idea: declining or merging it (VTI-BRD-013), or selecting it or not (VTI-BRD-040). The deciding facilitator is not named to the audience.
9540
+ */
9541
+ export interface IdeaDecision {
9542
+ decidedAt: string;
9543
+ reason?: Reason_VtcBoardsV0_1;
9544
+ /**
9545
+ * Present exactly when the idea is `merged`.
9546
+ */
9547
+ mergedInto?: IdeaId;
9548
+ /**
9549
+ * A `selected` idea's place in the board's timetable, where it has one.
9550
+ */
9551
+ slotId?: Key_VotingV0_1;
9552
+ /**
9553
+ * `selected` or `notSelected` only: whether the facilitator said the decision departs from the board's `selectionRule` (VTI-BRD-041); `reason` then says why.
9554
+ */
9555
+ departsFromRule?: boolean;
9556
+ /**
9557
+ * Present when a facilitator decided their own idea because no other facilitator existed (VTI-BRD-013).
9558
+ */
9559
+ ownIdea?: true;
9560
+ }
9561
+ /**
9562
+ * An idea's election as a board shows it (VTI-BRD-033): never who took a ticket or cast a ballot.
9563
+ */
9564
+ export interface IdeaElection {
9565
+ electionId: ElectionId;
9566
+ state: ElectionState;
9567
+ /**
9568
+ * The ballot box's latest board head's ballot count, where its board is public (VTI-VOT-052); absent otherwise. Counts ballots, not voters, where a later ballot replaces an earlier one.
9569
+ */
9570
+ ballotsOnBoard?: number;
9571
+ /**
9572
+ * When the head `ballotsOnBoard` was read from was issued.
9573
+ */
9574
+ boardHeadIssuedAt?: string;
9575
+ /**
9576
+ * Present once the election is tallied.
9577
+ */
9578
+ result?: ElectionResult;
9579
+ /**
9580
+ * Present with `result`: whether the community certified it (VTI-VOT-071).
9581
+ */
9582
+ certified?: boolean;
9583
+ }
9584
+ /**
9585
+ * Shown to facilitators only: an accepted idea whose election the ballot box has not yet registered, so the idea is still `proposed` (VTI-BRD-031). `refusal` is the ballot box's or community's refusal of the last attempt, after which the idea is no longer being opened.
9586
+ */
9587
+ export interface IdeaOpening {
9588
+ electionId: ElectionId;
9589
+ /**
9590
+ * When the facilitator accepted the idea.
9591
+ */
9592
+ startedAt: string;
9593
+ refusal?: {
9594
+ code: string;
9595
+ refusedAt: string;
9596
+ };
9597
+ }
9175
9598
  export interface IdentityChange {
9176
9599
  /**
9177
9600
  * `addKey` — a verification method joins its role's relationship and `keyRoles`. `retireKey` — a verification method leaves its relationship, `keyRoles` and the document. `revokeKey` — a verification method leaves its relationship and `keyRoles`, and stays in `verificationMethod` with `revoked` set to the compromise time (CONVENTIONS.md §9.1). `rotateUpdateKey` — the identifier's update authority moves to a committed routine successor. `commitUpdateKey` — a new routine successor is committed. `replaceRecoveryCommitment` — the recovery commitment changes. `useRecoveryKey` — the change is authorized by the recovery key, which the identifier then reveals.
@@ -10556,6 +10979,25 @@ export interface Node {
10556
10979
  */
10557
10980
  url?: string;
10558
10981
  }
10982
+ /**
10983
+ * A note as one caller may see it. `text` is absent from a `withdrawn` or `hidden` note for anyone but its author and the board's facilitators (VTI-BRD-021).
10984
+ */
10985
+ export interface Note {
10986
+ noteId: NoteId_VtcBoardsV0_1;
10987
+ boardId: BoardId;
10988
+ /**
10989
+ * The idea the note is attached to; absent for a note on the board itself.
10990
+ */
10991
+ ideaId?: IdeaId;
10992
+ author: Author;
10993
+ text?: NoteText_VtcBoardsV0_1;
10994
+ createdAt: string;
10995
+ state: NoteState;
10996
+ /**
10997
+ * A `hidden` note's reason, shown to everyone who sees the note.
10998
+ */
10999
+ hiddenReason?: Reason_VtcBoardsV0_1;
11000
+ }
10559
11001
  /**
10560
11002
  * The members of one notification, as notifications/notify carries them and as a recipient's agent records them. The originator is the `issuer` of the notifications/notify document and the addressee its `recipient`; neither is repeated here, because the originator's proof covers both.
10561
11003
  */
@@ -13683,6 +14125,15 @@ export interface AndroidApp_VaultV0_2 {
13683
14125
  */
13684
14126
  sha256CertFingerprints: [string, ...string[]];
13685
14127
  }
14128
+ /**
14129
+ * One place in a board's timetable that a selected idea can be put in (VTI-BRD-040): a place (`label`, e.g. a room) and a time.
14130
+ */
14131
+ export interface Slot_VtcBoardsV0_1 {
14132
+ slotId: Key_VotingV0_1;
14133
+ label: string;
14134
+ startsAt: string;
14135
+ endsAt: string;
14136
+ }
13686
14137
  /**
13687
14138
  * One transition in an entry's lifecycle.
13688
14139
  */
@@ -15113,6 +15564,13 @@ export interface WebvhServerRecord {
15113
15564
  updatedAt: string;
15114
15565
  ext?: Ext;
15115
15566
  }
15567
+ /**
15568
+ * A period, open from `opensAt` until `closesAt`. `closesAt` is after `opensAt` (a consumer check; JSON Schema cannot compare them).
15569
+ */
15570
+ export interface Window {
15571
+ opensAt: string;
15572
+ closesAt: string;
15573
+ }
15116
15574
  export interface WitnessKey {
15117
15575
  /**
15118
15576
  * The witness service's identifier for this identity. Opaque to the requester.