@openvtc/trust-tasks 0.25.0 → 0.25.2

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 (130) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/_shared/components.d.ts +308 -2
  3. package/dist/_shared/components.d.ts.map +1 -1
  4. package/dist/device/list/0.1/payload.d.ts +4 -4
  5. package/dist/device/list/0.1/payload.d.ts.map +1 -1
  6. package/dist/device/list/0.1/payload.js +6 -2
  7. package/dist/device/list/0.1/payload.js.map +1 -1
  8. package/dist/device/list/0.2/payload.d.ts +4 -4
  9. package/dist/device/list/0.2/payload.d.ts.map +1 -1
  10. package/dist/device/list/0.2/payload.js +6 -2
  11. package/dist/device/list/0.2/payload.js.map +1 -1
  12. package/dist/device/register/0.1/payload.d.ts +4 -4
  13. package/dist/device/register/0.1/payload.d.ts.map +1 -1
  14. package/dist/device/register/0.1/payload.js +6 -2
  15. package/dist/device/register/0.1/payload.js.map +1 -1
  16. package/dist/device/register/0.2/payload.d.ts +4 -4
  17. package/dist/device/register/0.2/payload.d.ts.map +1 -1
  18. package/dist/device/register/0.2/payload.js +6 -2
  19. package/dist/device/register/0.2/payload.js.map +1 -1
  20. package/dist/index.d.ts +17 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +17 -0
  23. package/dist/index.js.map +1 -1
  24. package/dist/provision/vta/_shared/0.1/vta.d.ts +16 -0
  25. package/dist/provision/vta/_shared/0.1/vta.d.ts.map +1 -0
  26. package/dist/provision/vta/_shared/0.1/vta.js +6 -0
  27. package/dist/provision/vta/_shared/0.1/vta.js.map +1 -0
  28. package/dist/provision/vta/claim/0.1/payload.d.ts +115 -0
  29. package/dist/provision/vta/claim/0.1/payload.d.ts.map +1 -0
  30. package/dist/provision/vta/claim/0.1/payload.js +69 -0
  31. package/dist/provision/vta/claim/0.1/payload.js.map +1 -0
  32. package/dist/provision/vta/redeem/0.1/payload.d.ts +371 -0
  33. package/dist/provision/vta/redeem/0.1/payload.d.ts.map +1 -0
  34. package/dist/provision/vta/redeem/0.1/payload.js +207 -0
  35. package/dist/provision/vta/redeem/0.1/payload.js.map +1 -0
  36. package/dist/vetting/_shared/0.1/hidden-vetting.d.ts +16 -0
  37. package/dist/vetting/_shared/0.1/hidden-vetting.d.ts.map +1 -0
  38. package/dist/vetting/_shared/0.1/hidden-vetting.js +6 -0
  39. package/dist/vetting/_shared/0.1/hidden-vetting.js.map +1 -0
  40. package/dist/vetting/attestation/0.1/payload.d.ts +94 -146
  41. package/dist/vetting/attestation/0.1/payload.d.ts.map +1 -1
  42. package/dist/vetting/attestation/0.1/payload.js +43 -43
  43. package/dist/vetting/attestation/0.1/payload.js.map +1 -1
  44. package/dist/vta/_shared/0.4/pcs-engine.d.ts +16 -0
  45. package/dist/vta/_shared/0.4/pcs-engine.d.ts.map +1 -0
  46. package/dist/vta/_shared/0.4/pcs-engine.js +6 -0
  47. package/dist/vta/_shared/0.4/pcs-engine.js.map +1 -0
  48. package/dist/vta/pcs/applications/create/0.1/payload.d.ts +1215 -0
  49. package/dist/vta/pcs/applications/create/0.1/payload.d.ts.map +1 -0
  50. package/dist/vta/pcs/applications/create/0.1/payload.js +724 -0
  51. package/dist/vta/pcs/applications/create/0.1/payload.js.map +1 -0
  52. package/dist/vta/pcs/applications/delete/0.1/payload.d.ts +253 -0
  53. package/dist/vta/pcs/applications/delete/0.1/payload.d.ts.map +1 -0
  54. package/dist/vta/pcs/applications/delete/0.1/payload.js +146 -0
  55. package/dist/vta/pcs/applications/delete/0.1/payload.js.map +1 -0
  56. package/dist/vta/pcs/applications/show/0.1/payload.d.ts +733 -0
  57. package/dist/vta/pcs/applications/show/0.1/payload.d.ts.map +1 -0
  58. package/dist/vta/pcs/applications/show/0.1/payload.js +450 -0
  59. package/dist/vta/pcs/applications/show/0.1/payload.js.map +1 -0
  60. package/dist/vta/pcs/attest/0.1/payload.d.ts +1456 -0
  61. package/dist/vta/pcs/attest/0.1/payload.d.ts.map +1 -0
  62. package/dist/vta/pcs/attest/0.1/payload.js +876 -0
  63. package/dist/vta/pcs/attest/0.1/payload.js.map +1 -0
  64. package/dist/vta/pcs/prove/0.1/payload.d.ts +1348 -0
  65. package/dist/vta/pcs/prove/0.1/payload.d.ts.map +1 -0
  66. package/dist/vta/pcs/prove/0.1/payload.js +804 -0
  67. package/dist/vta/pcs/prove/0.1/payload.js.map +1 -0
  68. package/dist/vta/pcs/root-accept/0.1/payload.d.ts +1100 -0
  69. package/dist/vta/pcs/root-accept/0.1/payload.d.ts.map +1 -0
  70. package/dist/vta/pcs/root-accept/0.1/payload.js +634 -0
  71. package/dist/vta/pcs/root-accept/0.1/payload.js.map +1 -0
  72. package/dist/vta/pcs/root-request/0.1/payload.d.ts +880 -0
  73. package/dist/vta/pcs/root-request/0.1/payload.d.ts.map +1 -0
  74. package/dist/vta/pcs/root-request/0.1/payload.js +496 -0
  75. package/dist/vta/pcs/root-request/0.1/payload.js.map +1 -0
  76. package/dist/vta/pcs/tokens/abandon/0.1/payload.d.ts +612 -0
  77. package/dist/vta/pcs/tokens/abandon/0.1/payload.d.ts.map +1 -0
  78. package/dist/vta/pcs/tokens/abandon/0.1/payload.js +355 -0
  79. package/dist/vta/pcs/tokens/abandon/0.1/payload.js.map +1 -0
  80. package/dist/vta/pcs/tokens/accept/0.1/payload.d.ts +1149 -0
  81. package/dist/vta/pcs/tokens/accept/0.1/payload.d.ts.map +1 -0
  82. package/dist/vta/pcs/tokens/accept/0.1/payload.js +657 -0
  83. package/dist/vta/pcs/tokens/accept/0.1/payload.js.map +1 -0
  84. package/dist/vta/pcs/tokens/request/0.1/payload.d.ts +908 -0
  85. package/dist/vta/pcs/tokens/request/0.1/payload.d.ts.map +1 -0
  86. package/dist/vta/pcs/tokens/request/0.1/payload.js +508 -0
  87. package/dist/vta/pcs/tokens/request/0.1/payload.js.map +1 -0
  88. package/dist/vta/pcs/verify-attestation/0.1/payload.d.ts +1423 -0
  89. package/dist/vta/pcs/verify-attestation/0.1/payload.d.ts.map +1 -0
  90. package/dist/vta/pcs/verify-attestation/0.1/payload.js +850 -0
  91. package/dist/vta/pcs/verify-attestation/0.1/payload.js.map +1 -0
  92. package/dist/vta/pcs/vetter/show/0.1/payload.d.ts +605 -0
  93. package/dist/vta/pcs/vetter/show/0.1/payload.d.ts.map +1 -0
  94. package/dist/vta/pcs/vetter/show/0.1/payload.js +351 -0
  95. package/dist/vta/pcs/vetter/show/0.1/payload.js.map +1 -0
  96. package/dist/vtc/vetting/hidden/publish/0.1/payload.d.ts +403 -486
  97. package/dist/vtc/vetting/hidden/publish/0.1/payload.d.ts.map +1 -1
  98. package/dist/vtc/vetting/hidden/publish/0.1/payload.js +240 -240
  99. package/dist/vtc/vetting/hidden/publish/0.1/payload.js.map +1 -1
  100. package/dist/vtc/vetting/hidden/show/0.1/payload.d.ts +482 -565
  101. package/dist/vtc/vetting/hidden/show/0.1/payload.d.ts.map +1 -1
  102. package/dist/vtc/vetting/hidden/show/0.1/payload.js +294 -294
  103. package/dist/vtc/vetting/hidden/show/0.1/payload.js.map +1 -1
  104. package/package.json +1 -1
  105. package/src/_shared/components.ts +312 -2
  106. package/src/device/list/0.1/payload.ts +6 -2
  107. package/src/device/list/0.2/payload.ts +6 -2
  108. package/src/device/register/0.1/payload.ts +6 -2
  109. package/src/device/register/0.2/payload.ts +6 -2
  110. package/src/index.ts +17 -0
  111. package/src/provision/vta/_shared/0.1/vta.ts +17 -0
  112. package/src/provision/vta/claim/0.1/payload.ts +88 -0
  113. package/src/provision/vta/redeem/0.1/payload.ts +255 -0
  114. package/src/vetting/_shared/0.1/hidden-vetting.ts +17 -0
  115. package/src/vetting/attestation/0.1/payload.ts +49 -101
  116. package/src/vta/_shared/0.4/pcs-engine.ts +17 -0
  117. package/src/vta/pcs/applications/create/0.1/payload.ts +768 -0
  118. package/src/vta/pcs/applications/delete/0.1/payload.ts +182 -0
  119. package/src/vta/pcs/applications/show/0.1/payload.ts +482 -0
  120. package/src/vta/pcs/attest/0.1/payload.ts +943 -0
  121. package/src/vta/pcs/prove/0.1/payload.ts +845 -0
  122. package/src/vta/pcs/root-accept/0.1/payload.ts +681 -0
  123. package/src/vta/pcs/root-request/0.1/payload.ts +559 -0
  124. package/src/vta/pcs/tokens/abandon/0.1/payload.ts +392 -0
  125. package/src/vta/pcs/tokens/accept/0.1/payload.ts +713 -0
  126. package/src/vta/pcs/tokens/request/0.1/payload.ts +581 -0
  127. package/src/vta/pcs/verify-attestation/0.1/payload.ts +888 -0
  128. package/src/vta/pcs/vetter/show/0.1/payload.ts +387 -0
  129. package/src/vtc/vetting/hidden/publish/0.1/payload.ts +247 -331
  130. package/src/vtc/vetting/hidden/show/0.1/payload.ts +295 -379
@@ -3,14 +3,9 @@
3
3
  * Source: specs/vtc/vetting/hidden/show/0.1/payload.schema.json
4
4
  */
5
5
 
6
- import type { Ext } from "../../../../../_shared/components.js";
6
+ import type { Ext, PublishedConfig, PublishedEvent, StoredConfig, StoredEvent, TickLength, Tier } from "../../../../../_shared/components.js";
7
7
 
8
8
 
9
- /**
10
- * The length of one tick of the drip, as an ISO 8601 duration in days and/or hours — at least `PT1H`. A label's tick `t` is the window starting `t` tick lengths after the label's start (`vtc/vetting/vetters/pcs-tokens`).
11
- */
12
- export type TickLength = string;
13
-
14
9
  /**
15
10
  * Read one criterion's stored hidden-vetting configuration, what it publishes, and the aggregate counts an administrator needs to run it. The outer document members are owned by the framework — SPEC §6.3.
16
11
  */
@@ -48,85 +43,6 @@ export interface VTCVettingHiddenShowResponsePayload {
48
43
  requirementsDigest: string | null;
49
44
  ext?: Ext;
50
45
  }
51
- /**
52
- * The parameters exactly as the community stores them, including the helper key it never publishes.
53
- */
54
- export interface StoredConfig {
55
- /**
56
- * The blind-signature suite in force, e.g. ps-ddh-bls12381.
57
- */
58
- suite: string;
59
- /**
60
- * The helper verification key, multibase. A public value, published as helperKey.
61
- */
62
- hvk: string;
63
- /**
64
- * The token verification key, multibase. Never the same key as hvk.
65
- */
66
- tvk: string;
67
- /**
68
- * Live vetter class periods, current first, stored as the bare YYYY-MM period.
69
- */
70
- livePeriods: string[];
71
- liveTokenLabels: string[];
72
- dripPerTick: number;
73
- tickLength: TickLength;
74
- events: StoredEvent[];
75
- }
76
- export interface StoredEvent {
77
- eventId: string;
78
- startDate: string;
79
- endDate: string;
80
- graceDays: number;
81
- groupFloor: number;
82
- tiers: Tier[];
83
- /**
84
- * Who approved the event, or null when nobody has. Recorded in storage only — dropped from the published shape (see published.events).
85
- */
86
- approvedBy?: string | null;
87
- }
88
- export interface Tier {
89
- /**
90
- * How the menu names it: desk, busy-desk.
91
- */
92
- name: string;
93
- /**
94
- * How many tokens a tick under this tier yields.
95
- */
96
- dripPerTick: number;
97
- }
98
- /**
99
- * The parameters exactly as they now appear in this community's join manifest, under vetting.ext. What an applicant and a vetter read.
100
- */
101
- export interface PublishedConfig {
102
- suite: string;
103
- /**
104
- * The helper verification key, multibase — named for its role on the wire rather than for hvk.
105
- */
106
- helperKey: string;
107
- /**
108
- * The token verification key, multibase — named for its role on the wire rather than for tvk.
109
- */
110
- tokenKey: string;
111
- /**
112
- * Class labels published whole, e.g. vetter/2026-09 — a request names one of these, not the bare period.
113
- */
114
- vetterLabels: string[];
115
- tokenLabels: string[];
116
- dripPerTick: number;
117
- tickLength: TickLength;
118
- events: PublishedEvent[];
119
- }
120
- /**
121
- * The published shape drops approvedBy and graceDays: who approved is the community's own record, and a vetter is told closesAfter when its request is approved rather than being handed the raw grace period here.
122
- */
123
- export interface PublishedEvent {
124
- eventId: string;
125
- startDate: string;
126
- endDate: string;
127
- groupFloor: number;
128
- tiers: Tier[];
129
- }
130
46
  /**
131
47
  * How one stored event stands today. Counts only — never which members asked.
132
48
  */
@@ -151,7 +67,7 @@ export interface EventStatus {
151
67
  }
152
68
 
153
69
  /** Shared definitions this specification references, re-exported under the names it used to declare them with. */
154
- export type { Ext };
70
+ export type { Ext, PublishedConfig, PublishedEvent, StoredConfig, StoredEvent, TickLength, Tier };
155
71
 
156
72
  /** Trust Task type URI. */
157
73
  export const TYPE_URI = "https://trusttasks.org/spec/vtc/vetting/hidden/show/0.1" as const;
@@ -195,72 +111,182 @@ export const PAYLOAD_SCHEMA = {
195
111
  }
196
112
  },
197
113
  "$defs": {
198
- "Tier": {
199
- "title": "Tier",
114
+ "EventStatus": {
115
+ "title": "EventStatus",
116
+ "description": "How one stored event stands today. Counts only — never which members asked.",
200
117
  "type": "object",
201
118
  "additionalProperties": false,
202
119
  "required": [
203
- "name",
204
- "dripPerTick"
120
+ "eventId",
121
+ "groupFloor",
122
+ "groupSize",
123
+ "approved",
124
+ "live"
205
125
  ],
206
126
  "properties": {
207
- "name": {
127
+ "eventId": {
208
128
  "type": "string",
209
- "minLength": 1,
210
- "description": "How the menu names it: desk, busy-desk."
129
+ "minLength": 1
211
130
  },
212
- "dripPerTick": {
131
+ "groupFloor": {
213
132
  "type": "integer",
214
133
  "minimum": 1,
215
- "description": "How many tokens a tick under this tier yields."
134
+ "description": "The smallest group this community will open the label for, as stored."
135
+ },
136
+ "groupSize": {
137
+ "type": "integer",
138
+ "minimum": 0,
139
+ "description": "How many members have asked to vet at this event through vtc/vetting/vetters/event-mode. The same count event-mode already returns to a vetter."
140
+ },
141
+ "approved": {
142
+ "type": "boolean",
143
+ "description": "Whether the stored event names an approver."
144
+ },
145
+ "live": {
146
+ "type": "boolean",
147
+ "description": "Derived: approved, groupSize at least groupFloor, and today no later than endDate plus graceDays."
216
148
  }
217
149
  }
218
150
  },
219
- "StoredEvent": {
220
- "title": "StoredEvent",
151
+ "Response": {
152
+ "$anchor": "response",
153
+ "title": "VTC Vetting — Hidden — Show — response payload",
221
154
  "type": "object",
222
155
  "additionalProperties": false,
223
156
  "required": [
224
- "eventId",
225
- "startDate",
226
- "endDate",
227
- "graceDays",
228
- "groupFloor",
229
- "tiers"
157
+ "criterionId",
158
+ "enabled",
159
+ "requirementsDigest"
230
160
  ],
161
+ "dependentRequired": {
162
+ "stored": [
163
+ "published",
164
+ "enrolledVetters",
165
+ "eventStatus"
166
+ ],
167
+ "published": [
168
+ "stored"
169
+ ],
170
+ "enrolledVetters": [
171
+ "stored"
172
+ ],
173
+ "eventStatus": [
174
+ "stored"
175
+ ]
176
+ },
231
177
  "properties": {
232
- "eventId": {
178
+ "criterionId": {
179
+ "type": "string",
180
+ "minLength": 1,
181
+ "description": "The criterion read."
182
+ },
183
+ "enabled": {
184
+ "type": "boolean",
185
+ "description": "Whether the criterion carries hidden-vetting parameters. When false, stored, published, enrolledVetters and eventStatus are absent."
186
+ },
187
+ "stored": {
188
+ "$ref": "#/$defs/StoredConfig"
189
+ },
190
+ "published": {
191
+ "$ref": "#/$defs/PublishedConfig"
192
+ },
193
+ "enrolledVetters": {
194
+ "type": "object",
195
+ "description": "For each live class label (vetter/<period>), how many members hold an enrolment under it. Counts only.",
196
+ "propertyNames": {
197
+ "pattern": "^vetter/[0-9]{4}-(0[1-9]|1[0-2])$"
198
+ },
199
+ "additionalProperties": {
200
+ "type": "integer",
201
+ "minimum": 0
202
+ }
203
+ },
204
+ "eventStatus": {
205
+ "type": "array",
206
+ "items": {
207
+ "$ref": "#/$defs/EventStatus"
208
+ },
209
+ "description": "One entry per stored event, in stored order."
210
+ },
211
+ "requirementsDigest": {
212
+ "type": [
213
+ "string",
214
+ "null"
215
+ ],
216
+ "description": "The criterion's current requirementsDigest. Null only when its manifest entry carries none."
217
+ },
218
+ "ext": {
219
+ "$ref": "#/$defs/Ext"
220
+ }
221
+ }
222
+ },
223
+ "Ext": {
224
+ "title": "Ext",
225
+ "description": "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.",
226
+ "type": "object",
227
+ "minProperties": 1,
228
+ "additionalProperties": true,
229
+ "propertyNames": {
230
+ "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
231
+ }
232
+ },
233
+ "PublishedConfig": {
234
+ "title": "PublishedConfig",
235
+ "description": "The parameters exactly as they now appear in this community's join manifest, under vetting.ext. What an applicant and a vetter read.",
236
+ "type": "object",
237
+ "additionalProperties": false,
238
+ "required": [
239
+ "suite",
240
+ "helperKey",
241
+ "tokenKey",
242
+ "vetterLabels",
243
+ "tokenLabels",
244
+ "dripPerTick",
245
+ "tickLength",
246
+ "events"
247
+ ],
248
+ "properties": {
249
+ "suite": {
233
250
  "type": "string",
234
251
  "minLength": 1
235
252
  },
236
- "startDate": {
253
+ "helperKey": {
237
254
  "type": "string",
238
- "format": "date"
255
+ "minLength": 1,
256
+ "description": "The helper verification key, multibase — named for its role on the wire rather than for hvk."
239
257
  },
240
- "endDate": {
258
+ "tokenKey": {
241
259
  "type": "string",
242
- "format": "date"
260
+ "minLength": 1,
261
+ "description": "The token verification key, multibase — named for its role on the wire rather than for tvk."
243
262
  },
244
- "graceDays": {
245
- "type": "integer",
246
- "minimum": 0
263
+ "vetterLabels": {
264
+ "type": "array",
265
+ "items": {
266
+ "type": "string",
267
+ "minLength": 1
268
+ },
269
+ "description": "Class labels published whole, e.g. vetter/2026-09 — a request names one of these, not the bare period."
247
270
  },
248
- "groupFloor": {
271
+ "tokenLabels": {
272
+ "type": "array",
273
+ "items": {
274
+ "type": "string",
275
+ "minLength": 1
276
+ }
277
+ },
278
+ "dripPerTick": {
249
279
  "type": "integer",
250
280
  "minimum": 1
251
281
  },
252
- "tiers": {
282
+ "tickLength": {
283
+ "$ref": "#/$defs/TickLength"
284
+ },
285
+ "events": {
253
286
  "type": "array",
254
287
  "items": {
255
- "$ref": "#/$defs/Tier"
288
+ "$ref": "#/$defs/PublishedEvent"
256
289
  }
257
- },
258
- "approvedBy": {
259
- "type": [
260
- "string",
261
- "null"
262
- ],
263
- "description": "Who approved the event, or null when nobody has. Recorded in storage only — dropped from the published shape (see published.events)."
264
290
  }
265
291
  }
266
292
  },
@@ -301,6 +327,33 @@ export const PAYLOAD_SCHEMA = {
301
327
  }
302
328
  }
303
329
  },
330
+ "Tier": {
331
+ "title": "Tier",
332
+ "type": "object",
333
+ "additionalProperties": false,
334
+ "required": [
335
+ "name",
336
+ "dripPerTick"
337
+ ],
338
+ "properties": {
339
+ "name": {
340
+ "type": "string",
341
+ "minLength": 1,
342
+ "description": "How the menu names it: desk, busy-desk."
343
+ },
344
+ "dripPerTick": {
345
+ "type": "integer",
346
+ "minimum": 1,
347
+ "description": "How many tokens a tick under this tier yields."
348
+ }
349
+ }
350
+ },
351
+ "TickLength": {
352
+ "title": "TickLength",
353
+ "type": "string",
354
+ "pattern": "^P(?:\\d+D(?:T\\d+H)?|T\\d+H)$",
355
+ "description": "The length of one tick of the drip, as an ISO 8601 duration in days and/or hours — at least `PT1H`. A label's tick `t` is the window starting `t` tick lengths after the label's start (`vtc/vetting/vetters/pcs-tokens`)."
356
+ },
304
357
  "StoredConfig": {
305
358
  "title": "StoredConfig",
306
359
  "description": "The parameters exactly as the community stores them, including the helper key it never publishes.",
@@ -362,66 +415,62 @@ export const PAYLOAD_SCHEMA = {
362
415
  }
363
416
  }
364
417
  },
365
- "PublishedConfig": {
366
- "title": "PublishedConfig",
367
- "description": "The parameters exactly as they now appear in this community's join manifest, under vetting.ext. What an applicant and a vetter read.",
418
+ "StoredEvent": {
419
+ "title": "StoredEvent",
368
420
  "type": "object",
369
421
  "additionalProperties": false,
370
422
  "required": [
371
- "suite",
372
- "helperKey",
373
- "tokenKey",
374
- "vetterLabels",
375
- "tokenLabels",
376
- "dripPerTick",
377
- "tickLength",
378
- "events"
423
+ "eventId",
424
+ "startDate",
425
+ "endDate",
426
+ "graceDays",
427
+ "groupFloor",
428
+ "tiers"
379
429
  ],
380
430
  "properties": {
381
- "suite": {
431
+ "eventId": {
382
432
  "type": "string",
383
433
  "minLength": 1
384
434
  },
385
- "helperKey": {
435
+ "startDate": {
386
436
  "type": "string",
387
- "minLength": 1,
388
- "description": "The helper verification key, multibase — named for its role on the wire rather than for hvk."
437
+ "format": "date"
389
438
  },
390
- "tokenKey": {
439
+ "endDate": {
391
440
  "type": "string",
392
- "minLength": 1,
393
- "description": "The token verification key, multibase — named for its role on the wire rather than for tvk."
394
- },
395
- "vetterLabels": {
396
- "type": "array",
397
- "items": {
398
- "type": "string",
399
- "minLength": 1
400
- },
401
- "description": "Class labels published whole, e.g. vetter/2026-09 — a request names one of these, not the bare period."
441
+ "format": "date"
402
442
  },
403
- "tokenLabels": {
404
- "type": "array",
405
- "items": {
406
- "type": "string",
407
- "minLength": 1
408
- }
443
+ "graceDays": {
444
+ "type": "integer",
445
+ "minimum": 0
409
446
  },
410
- "dripPerTick": {
447
+ "groupFloor": {
411
448
  "type": "integer",
412
449
  "minimum": 1
413
450
  },
414
- "tickLength": {
415
- "$ref": "#/$defs/TickLength"
416
- },
417
- "events": {
451
+ "tiers": {
418
452
  "type": "array",
419
453
  "items": {
420
- "$ref": "#/$defs/PublishedEvent"
454
+ "$ref": "#/$defs/Tier"
421
455
  }
456
+ },
457
+ "approvedBy": {
458
+ "type": [
459
+ "string",
460
+ "null"
461
+ ],
462
+ "description": "Who approved the event, or null when nobody has. Recorded in storage only — dropped from the published shape (see published.events)."
422
463
  }
423
464
  }
424
- },
465
+ }
466
+ }
467
+ } as const;
468
+
469
+ /** As {@link PAYLOAD_SCHEMA}, for the success-response variant. */
470
+ export const RESPONSE_PAYLOAD_SCHEMA = {
471
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
472
+ "$ref": "#/$defs/Response",
473
+ "$defs": {
425
474
  "EventStatus": {
426
475
  "title": "EventStatus",
427
476
  "description": "How one stored event stands today. Counts only — never which members asked.",
@@ -531,12 +580,6 @@ export const PAYLOAD_SCHEMA = {
531
580
  }
532
581
  }
533
582
  },
534
- "TickLength": {
535
- "title": "TickLength",
536
- "type": "string",
537
- "pattern": "^P(?:\\d+D(?:T\\d+H)?|T\\d+H)$",
538
- "description": "The length of one tick of the drip, as an ISO 8601 duration in days and/or hours — at least `PT1H`. A label's tick `t` is the window starting `t` tick lengths after the label's start (`vtc/vetting/vetters/pcs-tokens`)."
539
- },
540
583
  "Ext": {
541
584
  "title": "Ext",
542
585
  "description": "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.",
@@ -546,81 +589,64 @@ export const PAYLOAD_SCHEMA = {
546
589
  "propertyNames": {
547
590
  "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
548
591
  }
549
- }
550
- }
551
- } as const;
552
-
553
- /** As {@link PAYLOAD_SCHEMA}, for the success-response variant. */
554
- export const RESPONSE_PAYLOAD_SCHEMA = {
555
- "$schema": "https://json-schema.org/draft/2020-12/schema",
556
- "$ref": "#/$defs/Response",
557
- "$defs": {
558
- "Tier": {
559
- "title": "Tier",
560
- "type": "object",
561
- "additionalProperties": false,
562
- "required": [
563
- "name",
564
- "dripPerTick"
565
- ],
566
- "properties": {
567
- "name": {
568
- "type": "string",
569
- "minLength": 1,
570
- "description": "How the menu names it: desk, busy-desk."
571
- },
572
- "dripPerTick": {
573
- "type": "integer",
574
- "minimum": 1,
575
- "description": "How many tokens a tick under this tier yields."
576
- }
577
- }
578
592
  },
579
- "StoredEvent": {
580
- "title": "StoredEvent",
593
+ "PublishedConfig": {
594
+ "title": "PublishedConfig",
595
+ "description": "The parameters exactly as they now appear in this community's join manifest, under vetting.ext. What an applicant and a vetter read.",
581
596
  "type": "object",
582
597
  "additionalProperties": false,
583
598
  "required": [
584
- "eventId",
585
- "startDate",
586
- "endDate",
587
- "graceDays",
588
- "groupFloor",
589
- "tiers"
599
+ "suite",
600
+ "helperKey",
601
+ "tokenKey",
602
+ "vetterLabels",
603
+ "tokenLabels",
604
+ "dripPerTick",
605
+ "tickLength",
606
+ "events"
590
607
  ],
591
608
  "properties": {
592
- "eventId": {
609
+ "suite": {
593
610
  "type": "string",
594
611
  "minLength": 1
595
612
  },
596
- "startDate": {
613
+ "helperKey": {
597
614
  "type": "string",
598
- "format": "date"
615
+ "minLength": 1,
616
+ "description": "The helper verification key, multibase — named for its role on the wire rather than for hvk."
599
617
  },
600
- "endDate": {
618
+ "tokenKey": {
601
619
  "type": "string",
602
- "format": "date"
620
+ "minLength": 1,
621
+ "description": "The token verification key, multibase — named for its role on the wire rather than for tvk."
603
622
  },
604
- "graceDays": {
605
- "type": "integer",
606
- "minimum": 0
623
+ "vetterLabels": {
624
+ "type": "array",
625
+ "items": {
626
+ "type": "string",
627
+ "minLength": 1
628
+ },
629
+ "description": "Class labels published whole, e.g. vetter/2026-09 — a request names one of these, not the bare period."
607
630
  },
608
- "groupFloor": {
631
+ "tokenLabels": {
632
+ "type": "array",
633
+ "items": {
634
+ "type": "string",
635
+ "minLength": 1
636
+ }
637
+ },
638
+ "dripPerTick": {
609
639
  "type": "integer",
610
640
  "minimum": 1
611
641
  },
612
- "tiers": {
642
+ "tickLength": {
643
+ "$ref": "#/$defs/TickLength"
644
+ },
645
+ "events": {
613
646
  "type": "array",
614
647
  "items": {
615
- "$ref": "#/$defs/Tier"
648
+ "$ref": "#/$defs/PublishedEvent"
616
649
  }
617
- },
618
- "approvedBy": {
619
- "type": [
620
- "string",
621
- "null"
622
- ],
623
- "description": "Who approved the event, or null when nobody has. Recorded in storage only — dropped from the published shape (see published.events)."
624
650
  }
625
651
  }
626
652
  },
@@ -661,6 +687,33 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
661
687
  }
662
688
  }
663
689
  },
690
+ "Tier": {
691
+ "title": "Tier",
692
+ "type": "object",
693
+ "additionalProperties": false,
694
+ "required": [
695
+ "name",
696
+ "dripPerTick"
697
+ ],
698
+ "properties": {
699
+ "name": {
700
+ "type": "string",
701
+ "minLength": 1,
702
+ "description": "How the menu names it: desk, busy-desk."
703
+ },
704
+ "dripPerTick": {
705
+ "type": "integer",
706
+ "minimum": 1,
707
+ "description": "How many tokens a tick under this tier yields."
708
+ }
709
+ }
710
+ },
711
+ "TickLength": {
712
+ "title": "TickLength",
713
+ "type": "string",
714
+ "pattern": "^P(?:\\d+D(?:T\\d+H)?|T\\d+H)$",
715
+ "description": "The length of one tick of the drip, as an ISO 8601 duration in days and/or hours — at least `PT1H`. A label's tick `t` is the window starting `t` tick lengths after the label's start (`vtc/vetting/vetters/pcs-tokens`)."
716
+ },
664
717
  "StoredConfig": {
665
718
  "title": "StoredConfig",
666
719
  "description": "The parameters exactly as the community stores them, including the helper key it never publishes.",
@@ -722,190 +775,53 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
722
775
  }
723
776
  }
724
777
  },
725
- "PublishedConfig": {
726
- "title": "PublishedConfig",
727
- "description": "The parameters exactly as they now appear in this community's join manifest, under vetting.ext. What an applicant and a vetter read.",
778
+ "StoredEvent": {
779
+ "title": "StoredEvent",
728
780
  "type": "object",
729
781
  "additionalProperties": false,
730
782
  "required": [
731
- "suite",
732
- "helperKey",
733
- "tokenKey",
734
- "vetterLabels",
735
- "tokenLabels",
736
- "dripPerTick",
737
- "tickLength",
738
- "events"
783
+ "eventId",
784
+ "startDate",
785
+ "endDate",
786
+ "graceDays",
787
+ "groupFloor",
788
+ "tiers"
739
789
  ],
740
790
  "properties": {
741
- "suite": {
791
+ "eventId": {
742
792
  "type": "string",
743
793
  "minLength": 1
744
794
  },
745
- "helperKey": {
795
+ "startDate": {
746
796
  "type": "string",
747
- "minLength": 1,
748
- "description": "The helper verification key, multibase — named for its role on the wire rather than for hvk."
797
+ "format": "date"
749
798
  },
750
- "tokenKey": {
799
+ "endDate": {
751
800
  "type": "string",
752
- "minLength": 1,
753
- "description": "The token verification key, multibase — named for its role on the wire rather than for tvk."
754
- },
755
- "vetterLabels": {
756
- "type": "array",
757
- "items": {
758
- "type": "string",
759
- "minLength": 1
760
- },
761
- "description": "Class labels published whole, e.g. vetter/2026-09 — a request names one of these, not the bare period."
762
- },
763
- "tokenLabels": {
764
- "type": "array",
765
- "items": {
766
- "type": "string",
767
- "minLength": 1
768
- }
801
+ "format": "date"
769
802
  },
770
- "dripPerTick": {
803
+ "graceDays": {
771
804
  "type": "integer",
772
- "minimum": 1
773
- },
774
- "tickLength": {
775
- "$ref": "#/$defs/TickLength"
776
- },
777
- "events": {
778
- "type": "array",
779
- "items": {
780
- "$ref": "#/$defs/PublishedEvent"
781
- }
782
- }
783
- }
784
- },
785
- "EventStatus": {
786
- "title": "EventStatus",
787
- "description": "How one stored event stands today. Counts only — never which members asked.",
788
- "type": "object",
789
- "additionalProperties": false,
790
- "required": [
791
- "eventId",
792
- "groupFloor",
793
- "groupSize",
794
- "approved",
795
- "live"
796
- ],
797
- "properties": {
798
- "eventId": {
799
- "type": "string",
800
- "minLength": 1
805
+ "minimum": 0
801
806
  },
802
807
  "groupFloor": {
803
808
  "type": "integer",
804
- "minimum": 1,
805
- "description": "The smallest group this community will open the label for, as stored."
806
- },
807
- "groupSize": {
808
- "type": "integer",
809
- "minimum": 0,
810
- "description": "How many members have asked to vet at this event through vtc/vetting/vetters/event-mode. The same count event-mode already returns to a vetter."
811
- },
812
- "approved": {
813
- "type": "boolean",
814
- "description": "Whether the stored event names an approver."
815
- },
816
- "live": {
817
- "type": "boolean",
818
- "description": "Derived: approved, groupSize at least groupFloor, and today no later than endDate plus graceDays."
819
- }
820
- }
821
- },
822
- "Response": {
823
- "$anchor": "response",
824
- "title": "VTC Vetting — Hidden — Show — response payload",
825
- "type": "object",
826
- "additionalProperties": false,
827
- "required": [
828
- "criterionId",
829
- "enabled",
830
- "requirementsDigest"
831
- ],
832
- "dependentRequired": {
833
- "stored": [
834
- "published",
835
- "enrolledVetters",
836
- "eventStatus"
837
- ],
838
- "published": [
839
- "stored"
840
- ],
841
- "enrolledVetters": [
842
- "stored"
843
- ],
844
- "eventStatus": [
845
- "stored"
846
- ]
847
- },
848
- "properties": {
849
- "criterionId": {
850
- "type": "string",
851
- "minLength": 1,
852
- "description": "The criterion read."
853
- },
854
- "enabled": {
855
- "type": "boolean",
856
- "description": "Whether the criterion carries hidden-vetting parameters. When false, stored, published, enrolledVetters and eventStatus are absent."
857
- },
858
- "stored": {
859
- "$ref": "#/$defs/StoredConfig"
860
- },
861
- "published": {
862
- "$ref": "#/$defs/PublishedConfig"
863
- },
864
- "enrolledVetters": {
865
- "type": "object",
866
- "description": "For each live class label (vetter/<period>), how many members hold an enrolment under it. Counts only.",
867
- "propertyNames": {
868
- "pattern": "^vetter/[0-9]{4}-(0[1-9]|1[0-2])$"
869
- },
870
- "additionalProperties": {
871
- "type": "integer",
872
- "minimum": 0
873
- }
809
+ "minimum": 1
874
810
  },
875
- "eventStatus": {
811
+ "tiers": {
876
812
  "type": "array",
877
813
  "items": {
878
- "$ref": "#/$defs/EventStatus"
879
- },
880
- "description": "One entry per stored event, in stored order."
814
+ "$ref": "#/$defs/Tier"
815
+ }
881
816
  },
882
- "requirementsDigest": {
817
+ "approvedBy": {
883
818
  "type": [
884
819
  "string",
885
820
  "null"
886
821
  ],
887
- "description": "The criterion's current requirementsDigest. Null only when its manifest entry carries none."
888
- },
889
- "ext": {
890
- "$ref": "#/$defs/Ext"
822
+ "description": "Who approved the event, or null when nobody has. Recorded in storage only — dropped from the published shape (see published.events)."
891
823
  }
892
824
  }
893
- },
894
- "TickLength": {
895
- "title": "TickLength",
896
- "type": "string",
897
- "pattern": "^P(?:\\d+D(?:T\\d+H)?|T\\d+H)$",
898
- "description": "The length of one tick of the drip, as an ISO 8601 duration in days and/or hours — at least `PT1H`. A label's tick `t` is the window starting `t` tick lengths after the label's start (`vtc/vetting/vetters/pcs-tokens`)."
899
- },
900
- "Ext": {
901
- "title": "Ext",
902
- "description": "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.",
903
- "type": "object",
904
- "minProperties": 1,
905
- "additionalProperties": true,
906
- "propertyNames": {
907
- "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
908
- }
909
825
  }
910
826
  }
911
827
  } as const;