edoxen 0.7.2 → 0.8.1

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 (86) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +26 -1
  3. data/.rubocop_todo.yml +1 -1
  4. data/CHANGELOG.md +133 -0
  5. data/README.adoc +414 -182
  6. data/edoxen.gemspec +10 -10
  7. data/lib/edoxen/action.rb +5 -4
  8. data/lib/edoxen/agenda.rb +4 -7
  9. data/lib/edoxen/agenda_item.rb +12 -5
  10. data/lib/edoxen/approval.rb +2 -2
  11. data/lib/edoxen/attendance.rb +16 -10
  12. data/lib/edoxen/body_vocabulary_entry.rb +24 -0
  13. data/lib/edoxen/body_vocabulary_host.rb +40 -0
  14. data/lib/edoxen/cli.rb +175 -115
  15. data/lib/edoxen/consideration.rb +6 -4
  16. data/lib/edoxen/contact.rb +35 -0
  17. data/lib/edoxen/contact_collection.rb +26 -0
  18. data/lib/edoxen/contact_identifier.rb +13 -0
  19. data/lib/edoxen/contact_method.rb +16 -0
  20. data/lib/edoxen/date_time_range.rb +16 -0
  21. data/lib/edoxen/deadline.rb +1 -1
  22. data/lib/edoxen/decision.rb +57 -0
  23. data/lib/edoxen/decision_collection.rb +10 -0
  24. data/lib/edoxen/decision_date.rb +9 -0
  25. data/lib/edoxen/decision_metadata.rb +27 -0
  26. data/lib/edoxen/decision_relation.rb +11 -0
  27. data/lib/edoxen/declaration.rb +25 -0
  28. data/lib/edoxen/entity_ref.rb +74 -0
  29. data/lib/edoxen/enums.rb +123 -9
  30. data/lib/edoxen/error.rb +1 -1
  31. data/lib/edoxen/extension_attribute.rb +78 -0
  32. data/lib/edoxen/host_ref.rb +1 -1
  33. data/lib/edoxen/link_checker.rb +143 -34
  34. data/lib/edoxen/localized_name.rb +16 -0
  35. data/lib/edoxen/localized_string.rb +22 -0
  36. data/lib/edoxen/meeting.rb +34 -42
  37. data/lib/edoxen/meeting_collection.rb +1 -2
  38. data/lib/edoxen/meeting_collection_metadata.rb +4 -2
  39. data/lib/edoxen/meeting_component.rb +37 -0
  40. data/lib/edoxen/meeting_extension.rb +25 -0
  41. data/lib/edoxen/meeting_identifier.rb +1 -1
  42. data/lib/edoxen/meeting_series.rb +26 -0
  43. data/lib/edoxen/minutes.rb +3 -4
  44. data/lib/edoxen/minutes_section.rb +12 -13
  45. data/lib/edoxen/motion.rb +51 -0
  46. data/lib/edoxen/name.rb +29 -0
  47. data/lib/edoxen/officer.rb +19 -0
  48. data/lib/edoxen/officers_host.rb +19 -0
  49. data/lib/edoxen/person.rb +5 -9
  50. data/lib/edoxen/physical_venue.rb +15 -0
  51. data/lib/edoxen/recurrence.rb +27 -0
  52. data/lib/edoxen/recurrence_by_day.rb +10 -0
  53. data/lib/edoxen/reference.rb +1 -1
  54. data/lib/edoxen/reference_data.rb +34 -44
  55. data/lib/edoxen/schema_validator.rb +3 -4
  56. data/lib/edoxen/source_url.rb +4 -4
  57. data/lib/edoxen/statement.rb +21 -0
  58. data/lib/edoxen/structured_identifier.rb +2 -2
  59. data/lib/edoxen/topic.rb +39 -0
  60. data/lib/edoxen/topic_asset.rb +14 -0
  61. data/lib/edoxen/topic_document.rb +16 -0
  62. data/lib/edoxen/venue.rb +79 -0
  63. data/lib/edoxen/venue_collection.rb +18 -0
  64. data/lib/edoxen/venue_validator.rb +74 -0
  65. data/lib/edoxen/version.rb +1 -1
  66. data/lib/edoxen/virtual_venue.rb +15 -0
  67. data/lib/edoxen/vote_record.rb +17 -13
  68. data/lib/edoxen/voting.rb +45 -0
  69. data/lib/edoxen/voting_counts.rb +23 -0
  70. data/lib/edoxen.rb +47 -15
  71. data/schema/edoxen.yaml +1376 -246
  72. data/schema/meeting.yaml +1207 -272
  73. data/sig/edoxen.rbs +581 -1
  74. metadata +62 -22
  75. data/lib/edoxen/_metadata.rb.deprecated +0 -57
  76. data/lib/edoxen/localization.rb +0 -18
  77. data/lib/edoxen/location.rb +0 -15
  78. data/lib/edoxen/meeting_localization.rb +0 -15
  79. data/lib/edoxen/resolution.rb +0 -43
  80. data/lib/edoxen/resolution_collection.rb +0 -10
  81. data/lib/edoxen/resolution_date.rb +0 -11
  82. data/lib/edoxen/resolution_metadata.rb +0 -30
  83. data/lib/edoxen/resolution_relation.rb +0 -11
  84. data/lib/edoxen/resolution_set.rb +0 -17
  85. data/lib/edoxen/schedule_item.rb +0 -27
  86. data/lib/edoxen/schedule_item_localization.rb +0 -21
data/schema/meeting.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- $schema: "http://json-schema.org/draft-07/schema#"
3
- $id: "https://github.com/edoxen/edoxen/schema/meeting.yaml"
4
- title: "Edoxen Meeting Schema"
2
+ "$schema": http://json-schema.org/draft-07/schema#
3
+ "$id": https://github.com/edoxen/edoxen-model/schema/meeting.yaml
4
+ title: Edoxen Meeting Schema
5
5
  description: |
6
6
  Schema for validating Edoxen Meeting/Agenda YAML files.
7
7
 
@@ -16,47 +16,61 @@ description: |
16
16
  `spec/edoxen/schema_meeting_enum_sync_spec.rb`.
17
17
  type: object
18
18
  oneOf:
19
- - $ref: "#/$defs/MeetingCollection"
20
- - $ref: "#/$defs/Meeting"
21
-
22
- $defs:
23
-
24
- # ====================================================================
25
- # Reused from schema/edoxen.yaml (re-declared here so this file is
26
- # self-contained — schema/meeting.yaml does not depend on
27
- # schema/edoxen.yaml).
28
- # ====================================================================
29
-
19
+ - "$ref": "#/$defs/MeetingCollection"
20
+ - "$ref": "#/$defs/Meeting"
21
+ - "$ref": "#/$defs/MeetingSeries"
22
+ "$defs":
30
23
  StructuredIdentifier:
31
24
  type: object
32
- description: "prefix + number identifier. A Meeting carries 1..*."
25
+ description: An identifier (prefix + number). A Decision carries 1..* of these.
33
26
  additionalProperties: false
34
- required: [prefix, number]
27
+ required:
28
+ - prefix
29
+ - number
35
30
  properties:
36
- prefix: { type: string }
37
- number: { type: string }
38
-
31
+ prefix:
32
+ type: string
33
+ number:
34
+ type: string
35
+ EntityRef:
36
+ type: object
37
+ description: |
38
+ Typed cross-reference between entities (1.0, TODO.refactor/1.0-design).
39
+ Exactly one of `urn`, `identifier`, or `local_ref` should be set;
40
+ the gem's `EntityRef#valid?` enforces this in Ruby.
41
+ additionalProperties: false
42
+ properties:
43
+ urn:
44
+ type: string
45
+ identifier:
46
+ "$ref": "#/$defs/StructuredIdentifier"
47
+ local_ref:
48
+ type: string
49
+ kind:
50
+ type: string
51
+ role:
52
+ type: string
53
+ note:
54
+ type: string
39
55
  SourceUrl:
40
56
  type: object
41
- description: "Per-language canonical source URL (PDF, page, register link)."
57
+ description: Per-spelling canonical source URL (e.g. one PDF per language).
42
58
  additionalProperties: false
43
- required: [ref]
59
+ required:
60
+ - ref
44
61
  properties:
45
- ref: { type: string }
46
- format: { type: string }
47
- language_code:
62
+ ref:
63
+ type: string
64
+ format:
48
65
  type: string
49
- pattern: "^[a-z]{3}$"
66
+ spelling:
67
+ type: string
68
+ description: ISO 24229 spelling/conversion system code
50
69
  kind:
51
- $ref: "#/$defs/SourceUrlKind"
52
-
53
- # ====================================================================
54
- # Meeting-side primitive types.
55
- # ====================================================================
56
-
70
+ "$ref": "#/$defs/SourceUrlKind"
57
71
  DateRange:
58
72
  type: object
59
- description: "Start + end date pair for multi-day meetings."
73
+ description: Start + end date pair for multi-day meetings.
60
74
  additionalProperties: false
61
75
  properties:
62
76
  start:
@@ -65,199 +79,411 @@ $defs:
65
79
  end:
66
80
  type: string
67
81
  format: date
68
-
69
- Location:
82
+ ContactMethodKind:
83
+ type: string
84
+ description: Polymorphic communication channel kind.
85
+ enum:
86
+ - phone
87
+ - mobile
88
+ - fax
89
+ - email
90
+ - url
91
+ - mail
92
+ - pager
93
+ - message
94
+ - other
95
+ LocalizedString:
70
96
  type: object
71
- description: "Venue geography. Multi-venue meetings carry one Location per venue."
97
+ description: |
98
+ One language-specific value of a translatable String field.
99
+ `spelling` is an ISO 24229 spelling/conversion system code.
100
+ Always verbose — single-language data uses the same
101
+ `[{ spelling, value }]` shape as multi-language data.
72
102
  additionalProperties: false
103
+ required:
104
+ - spelling
105
+ - value
73
106
  properties:
74
- name: { type: string }
75
- address: { type: string }
76
- link: { type: string }
77
- phone: { type: string }
78
- note: { type: string }
79
- lat: { type: number }
80
- lon: { type: number }
81
-
82
- Person:
107
+ spelling:
108
+ type: string
109
+ value:
110
+ type: string
111
+ extensions:
112
+ type: array
113
+ items:
114
+ "$ref": "#/$defs/MeetingExtension"
115
+ LocalizedName:
83
116
  type: object
84
- description: "Identity + role + affiliation + contact."
117
+ description: |
118
+ One language-specific value of a translatable Name field.
119
+ Mirrors LocalizedString but carries a structured Name.
85
120
  additionalProperties: false
121
+ required:
122
+ - spelling
123
+ - value
86
124
  properties:
87
- name: { type: string }
88
- role: { type: string }
89
- affiliation: { type: string }
90
- email: { type: string }
91
- phone: { type: string }
92
- orcid: { type: string }
93
-
94
- HostRef:
125
+ spelling:
126
+ type: string
127
+ value:
128
+ "$ref": "#/$defs/Name"
129
+ extensions:
130
+ type: array
131
+ items:
132
+ "$ref": "#/$defs/MeetingExtension"
133
+ ContactMethod:
95
134
  type: object
96
- description: "Typed reference to an organization that hosts or co-organizes a meeting."
135
+ description: |
136
+ One polymorphic communication channel — phone, email, fax, url,
137
+ mail, etc. `kind` discriminates the channel; `value` carries the
138
+ address/number; `label` is a free-form display hint ("Office",
139
+ "Front desk"). OCP: new channel kinds are added via the
140
+ ContactMethodKind enum (or `other` + extensions).
97
141
  additionalProperties: false
98
- required: [ref]
99
142
  properties:
100
- ref: { type: string }
101
- type:
102
- $ref: "#/$defs/HostType"
103
- role: { type: string }
104
- contact:
105
- $ref: "#/$defs/Person"
106
-
107
- ScheduleItemLocalization:
143
+ kind:
144
+ "$ref": "#/$defs/ContactMethodKind"
145
+ value:
146
+ type: string
147
+ label:
148
+ type: string
149
+ primary:
150
+ type: boolean
151
+ extensions:
152
+ type: array
153
+ items:
154
+ "$ref": "#/$defs/MeetingExtension"
155
+ ContactIdentifierKind:
156
+ type: string
157
+ description: Polymorphic external identifier scheme for a Contact.
158
+ enum:
159
+ - orcid
160
+ - isni
161
+ - wikidata
162
+ - ror
163
+ - ringgold
164
+ - github
165
+ - other
166
+ ContactIdentifier:
108
167
  type: object
109
- description: "Per-language content for a ScheduleItem."
168
+ description: |
169
+ One polymorphic external identifier — ORCID, ISNI, Wikidata QID,
170
+ ROR, Ringgold, GitHub handle, etc. Replaces the hard-coded `orcid`
171
+ field. OCP: new identifier schemes are added via the
172
+ ContactIdentifierKind enum (or `other` + extensions).
110
173
  additionalProperties: false
111
- required: [language_code]
112
174
  properties:
113
- language_code:
175
+ kind:
176
+ "$ref": "#/$defs/ContactIdentifierKind"
177
+ value:
114
178
  type: string
115
- pattern: "^[a-z]{3}$"
116
- script:
179
+ extensions:
180
+ type: array
181
+ items:
182
+ "$ref": "#/$defs/MeetingExtension"
183
+ Name:
184
+ type: object
185
+ description: |
186
+ Structured personal/organisational name (VCARD RFC 6350
187
+ conventions). `formatted` is the pre-built display string (FN);
188
+ the structured components (N) are stored separately for sorting,
189
+ indexing, or locale-aware rendering.
190
+ additionalProperties: false
191
+ properties:
192
+ formatted:
117
193
  type: string
118
- pattern: "^[A-Z][a-z]{3}$"
119
- event: { type: string }
120
- description: { type: string }
121
-
122
- ScheduleItem:
194
+ family:
195
+ type: string
196
+ given:
197
+ type: string
198
+ additional:
199
+ type: string
200
+ prefix:
201
+ type: string
202
+ suffix:
203
+ type: string
204
+ extensions:
205
+ type: array
206
+ items:
207
+ "$ref": "#/$defs/MeetingExtension"
208
+ Contact:
123
209
  type: object
124
- description: "One entry in the meeting timetable."
210
+ description: |
211
+ VCARD-like abstract contact. 1.0: per-field Localized
212
+ (name, title, affiliation, address). Added `urn` (registry
213
+ identity) and `ref` (reference-by-URN).
125
214
  additionalProperties: false
126
215
  properties:
127
- date:
216
+ ref:
128
217
  type: string
129
- format: date
130
- time: { type: string }
131
- event: { type: string }
132
- description: { type: string }
133
- room: { type: string }
134
- localizations:
218
+ description: URN reference; if set, ignore other fields
219
+ urn:
220
+ type: string
221
+ pattern: "^urn:edoxen:contact:[^:]+:[^:]+$"
222
+ name:
135
223
  type: array
136
224
  items:
137
- $ref: "#/$defs/ScheduleItemLocalization"
138
-
225
+ "$ref": "#/$defs/LocalizedName"
226
+ kind:
227
+ type: string
228
+ role:
229
+ type: string
230
+ title:
231
+ type: array
232
+ items:
233
+ "$ref": "#/$defs/LocalizedString"
234
+ affiliation:
235
+ type: array
236
+ items:
237
+ "$ref": "#/$defs/LocalizedString"
238
+ contact_methods:
239
+ type: array
240
+ items:
241
+ "$ref": "#/$defs/ContactMethod"
242
+ identifiers:
243
+ type: array
244
+ items:
245
+ "$ref": "#/$defs/ContactIdentifier"
246
+ address:
247
+ type: array
248
+ items:
249
+ "$ref": "#/$defs/LocalizedString"
250
+ extensions:
251
+ type: array
252
+ items:
253
+ "$ref": "#/$defs/MeetingExtension"
254
+ Person:
255
+ type: object
256
+ description: |
257
+ A Contact that is specifically an individual human. Schema
258
+ duplicates Contact's properties because JSON-Schema draft-07
259
+ doesn't support `extends`. Same shape; semantically a subclass.
260
+ additionalProperties: false
261
+ properties:
262
+ ref:
263
+ type: string
264
+ urn:
265
+ type: string
266
+ pattern: "^urn:edoxen:contact:[^:]+:[^:]+$"
267
+ name:
268
+ type: array
269
+ items:
270
+ "$ref": "#/$defs/LocalizedName"
271
+ kind:
272
+ type: string
273
+ role:
274
+ type: string
275
+ title:
276
+ type: array
277
+ items:
278
+ "$ref": "#/$defs/LocalizedString"
279
+ affiliation:
280
+ type: array
281
+ items:
282
+ "$ref": "#/$defs/LocalizedString"
283
+ contact_methods:
284
+ type: array
285
+ items:
286
+ "$ref": "#/$defs/ContactMethod"
287
+ identifiers:
288
+ type: array
289
+ items:
290
+ "$ref": "#/$defs/ContactIdentifier"
291
+ address:
292
+ type: array
293
+ items:
294
+ "$ref": "#/$defs/LocalizedString"
295
+ extensions:
296
+ type: array
297
+ items:
298
+ "$ref": "#/$defs/MeetingExtension"
299
+ HostRef:
300
+ type: object
301
+ description: Typed reference to a hosting organization.
302
+ additionalProperties: false
303
+ required:
304
+ - ref
305
+ properties:
306
+ ref:
307
+ type: string
308
+ type:
309
+ "$ref": "#/$defs/HostType"
310
+ role:
311
+ type: string
312
+ contact:
313
+ "$ref": "#/$defs/Contact"
139
314
  Attendance:
140
315
  type: object
141
- description: "One attendance record per person at a Meeting."
316
+ description: One attendance record per person at a Meeting.
142
317
  additionalProperties: false
143
- required: [person, status]
318
+ required:
319
+ - person
320
+ - status
144
321
  properties:
145
322
  person:
146
- $ref: "#/$defs/Person"
323
+ "$ref": "#/$defs/Person"
147
324
  status:
148
- $ref: "#/$defs/ParticipationStatus"
149
- affiliation: { type: string }
325
+ "$ref": "#/$defs/ParticipationStatus"
326
+ role:
327
+ "$ref": "#/$defs/AttendanceRole"
328
+ response:
329
+ "$ref": "#/$defs/AttendanceResponse"
330
+ affiliation:
331
+ type: string
150
332
  proxy_for:
151
- $ref: "#/$defs/Person"
152
- notes: { type: string }
153
-
333
+ "$ref": "#/$defs/Person"
334
+ notes:
335
+ type: string
336
+ extensions:
337
+ type: array
338
+ items:
339
+ "$ref": "#/$defs/MeetingExtension"
154
340
  VoteRecord:
155
341
  type: object
156
- description: "One vote by one person on one resolution at one meeting."
342
+ description: One vote by one person on one decision/voting.
157
343
  additionalProperties: false
158
- required: [resolution_ref, person, vote]
344
+ required:
345
+ - person
346
+ - vote
159
347
  properties:
160
- resolution_ref: { type: string }
348
+ decision_ref:
349
+ type: string
350
+ voting_ref:
351
+ type: string
161
352
  person:
162
- $ref: "#/$defs/Person"
163
- affiliation: { type: string }
353
+ "$ref": "#/$defs/Person"
354
+ affiliation:
355
+ type: string
164
356
  vote:
165
- $ref: "#/$defs/VoteType"
166
- notes: { type: string }
167
-
357
+ "$ref": "#/$defs/VoteType"
358
+ role:
359
+ type: string
360
+ notes:
361
+ type: string
362
+ extensions:
363
+ type: array
364
+ items:
365
+ "$ref": "#/$defs/MeetingExtension"
168
366
  MinutesSection:
169
367
  type: object
170
- description: |
171
- One section of a Meeting's minutes — typically tied to an agenda
172
- item by its `number` field. Carries the narrative as Markdown
173
- (the format the GLM-OCR pipeline emits) plus an optional page
174
- range for provenance back to the source PDF.
368
+ description: 'One section of a Meeting''s minutes — typically tied to an agenda item by `number`. 1.0: per-field Localized.'
175
369
  additionalProperties: false
176
370
  properties:
177
- number: { type: string }
178
- title: { type: string }
179
- narrative: { type: string }
180
- page_start: { type: integer }
181
- page_end: { type: integer }
371
+ number:
372
+ type: string
373
+ title:
374
+ type: array
375
+ items:
376
+ "$ref": "#/$defs/LocalizedString"
377
+ narrative:
378
+ type: array
379
+ items:
380
+ "$ref": "#/$defs/LocalizedString"
381
+ page_start:
382
+ type: integer
383
+ page_end:
384
+ type: integer
182
385
  references:
183
386
  type: array
184
387
  items:
185
- $ref: "#/$defs/Reference"
186
-
388
+ "$ref": "#/$defs/Reference"
389
+ statements:
390
+ type: array
391
+ items:
392
+ "$ref": "#/$defs/Statement"
393
+ topic_ref:
394
+ type: string
395
+ description: |
396
+ URN back-reference to the Topic this section records.
397
+ Optional; formalises the convention that
398
+ `MinutesSection#number` matches `AgendaItem#label`.
187
399
  Minutes:
188
400
  type: object
189
401
  description: |
190
- The narrative record of a Meeting what was said, by whom, in
191
- what order, with what outcome. Distinct from Agenda (the business
192
- order drafted before the meeting) and from ResolutionCollection
193
- (the formal decisions adopted). The Minutes are the running
194
- record. One Minutes document per language; sections are typically
195
- keyed by agenda-item number so consumers can join
196
- Minutes ↔ AgendaItem ↔ Resolution.
402
+ The narrative record of a Meeting. 1.0: per-document language_code
403
+ + script replaced by a single `spelling` (ISO 24229).
197
404
  additionalProperties: false
198
405
  properties:
199
406
  identifier:
200
407
  type: array
201
408
  items:
202
- $ref: "#/$defs/StructuredIdentifier"
203
- urn: { type: string }
204
- language_code:
409
+ "$ref": "#/$defs/StructuredIdentifier"
410
+ urn:
411
+ type: string
412
+ spelling:
205
413
  type: string
206
- pattern: "^[a-z]{3}$"
207
- script:
414
+ description: ISO 24229 spelling/conversion system code
415
+ source_doc:
416
+ type: string
417
+ source_pages:
208
418
  type: string
209
- pattern: "^[A-Z][a-z]{3}$"
210
- source_doc: { type: string }
211
- source_pages: { type: string }
212
419
  sections:
213
420
  type: array
214
421
  items:
215
- $ref: "#/$defs/MinutesSection"
216
-
422
+ "$ref": "#/$defs/MinutesSection"
217
423
  Deadline:
218
424
  type: object
219
- description: "A time-bound requirement (registration, submission, etc.)."
425
+ description: 'A time-bound requirement. 1.0: per-field Localized.'
220
426
  additionalProperties: false
221
- required: [date]
427
+ required:
428
+ - date
222
429
  properties:
223
430
  date:
224
431
  type: string
225
432
  format: date
226
- description: { type: string }
227
-
433
+ description:
434
+ type: array
435
+ items:
436
+ "$ref": "#/$defs/LocalizedString"
228
437
  Reference:
229
438
  type: object
230
- description: "Generic document reference (used by AgendaItem.references)."
439
+ description: Generic document reference.
231
440
  additionalProperties: false
232
441
  properties:
233
- ref: { type: string }
234
- kind: { type: string }
235
- title: { type: string }
236
-
237
- # ====================================================================
238
- # Agenda side.
239
- # ====================================================================
240
-
442
+ ref:
443
+ type: string
444
+ kind:
445
+ type: string
446
+ title:
447
+ type: array
448
+ items:
449
+ "$ref": "#/$defs/LocalizedString"
241
450
  AgendaItem:
242
451
  type: object
243
- description: "One entry on an Agenda."
452
+ description: 'One entry on an Agenda. 1.0: per-field Localized.'
244
453
  additionalProperties: false
245
454
  properties:
246
- label: { type: string }
455
+ label:
456
+ type: string
247
457
  kind:
248
- $ref: "#/$defs/AgendaItemKind"
249
- title: { type: string }
250
- description: { type: string }
458
+ "$ref": "#/$defs/AgendaItemKind"
459
+ title:
460
+ type: array
461
+ items:
462
+ "$ref": "#/$defs/LocalizedString"
463
+ description:
464
+ type: array
465
+ items:
466
+ "$ref": "#/$defs/LocalizedString"
251
467
  references:
252
468
  type: array
253
469
  items:
254
- $ref: "#/$defs/Reference"
470
+ "$ref": "#/$defs/Reference"
255
471
  outcome:
256
- $ref: "#/$defs/AgendaItemOutcome"
257
- resolution_ref:
472
+ "$ref": "#/$defs/AgendaItemOutcome"
473
+ decision_ref:
258
474
  type: string
259
- description: "URN of the resolution this item produced."
260
-
475
+ topics:
476
+ type: array
477
+ items:
478
+ "$ref": "#/$defs/Topic"
479
+ components:
480
+ type: array
481
+ items:
482
+ type: string
483
+ extensions:
484
+ type: array
485
+ items:
486
+ "$ref": "#/$defs/MeetingExtension"
261
487
  Agenda:
262
488
  type: object
263
489
  description: |
@@ -268,213 +494,922 @@ $defs:
268
494
  identifier:
269
495
  type: array
270
496
  items:
271
- $ref: "#/$defs/StructuredIdentifier"
497
+ "$ref": "#/$defs/StructuredIdentifier"
272
498
  status:
273
- $ref: "#/$defs/AgendaStatus"
274
- source_doc: { type: string }
499
+ "$ref": "#/$defs/AgendaStatus"
500
+ source_doc:
501
+ type: string
275
502
  items:
276
503
  type: array
277
504
  items:
278
- $ref: "#/$defs/AgendaItem"
279
- opening_session:
280
- $ref: "#/$defs/ScheduleItem"
281
- closing_session:
282
- $ref: "#/$defs/ScheduleItem"
283
-
284
- # ====================================================================
285
- # Meeting side.
286
- # ====================================================================
287
-
288
- MeetingRelation:
505
+ "$ref": "#/$defs/AgendaItem"
506
+ extensions:
507
+ type: array
508
+ items:
509
+ "$ref": "#/$defs/MeetingExtension"
510
+ TopicDocument:
289
511
  type: object
290
- description: "Directed link between two meetings."
512
+ description: 'Text-bearing document about a Topic. 1.0: per-field Localized.'
291
513
  additionalProperties: false
292
- required: [source, destination, type]
293
514
  properties:
294
- source:
295
- $ref: "#/$defs/StructuredIdentifier"
296
- destination:
297
- $ref: "#/$defs/StructuredIdentifier"
515
+ identifier:
516
+ type: string
517
+ title:
518
+ type: array
519
+ items:
520
+ "$ref": "#/$defs/LocalizedString"
521
+ version:
522
+ type: string
523
+ status:
524
+ type: string
525
+ url:
526
+ type: string
527
+ format:
528
+ type: string
529
+ spelling:
530
+ type: string
531
+ description: ISO 24229 spelling/conversion system code
532
+ extensions:
533
+ type: array
534
+ items:
535
+ "$ref": "#/$defs/MeetingExtension"
536
+ TopicAsset:
537
+ type: object
538
+ description: 'Non-text resource about a Topic. 1.0: per-field Localized.'
539
+ additionalProperties: false
540
+ properties:
541
+ identifier:
542
+ type: string
543
+ title:
544
+ type: array
545
+ items:
546
+ "$ref": "#/$defs/LocalizedString"
547
+ kind:
548
+ type: string
549
+ url:
550
+ type: string
551
+ format:
552
+ type: string
553
+ extensions:
554
+ type: array
555
+ items:
556
+ "$ref": "#/$defs/MeetingExtension"
557
+ Topic:
558
+ type: object
559
+ description: 'The subject of discussion at a Meeting. 1.0: per-field Localized.'
560
+ additionalProperties: false
561
+ properties:
562
+ identifier:
563
+ type: string
564
+ urn:
565
+ type: string
566
+ title:
567
+ type: array
568
+ items:
569
+ "$ref": "#/$defs/LocalizedString"
570
+ description:
571
+ type: array
572
+ items:
573
+ "$ref": "#/$defs/LocalizedString"
574
+ status:
575
+ "$ref": "#/$defs/TopicStatus"
576
+ resumption_of:
577
+ type: string
578
+ documents:
579
+ type: array
580
+ items:
581
+ "$ref": "#/$defs/TopicDocument"
582
+ assets:
583
+ type: array
584
+ items:
585
+ "$ref": "#/$defs/TopicAsset"
586
+ references:
587
+ type: array
588
+ items:
589
+ "$ref": "#/$defs/Reference"
590
+ motions:
591
+ type: array
592
+ items:
593
+ type: string
594
+ decisions:
595
+ type: array
596
+ items:
597
+ type: string
598
+ statements:
599
+ type: array
600
+ items:
601
+ "$ref": "#/$defs/Statement"
602
+ declarations:
603
+ type: array
604
+ items:
605
+ "$ref": "#/$defs/Declaration"
606
+ extensions:
607
+ type: array
608
+ items:
609
+ "$ref": "#/$defs/MeetingExtension"
610
+ Venue:
611
+ type: object
612
+ description: |
613
+ Polymorphic place where a Meeting happens. `kind` discriminates
614
+ physical vs virtual; all fields from both subtypes live here as
615
+ optional siblings. 1.0: per-field Localized (name, label,
616
+ description, address, building, floor, room, access_notes).
617
+ Added `urn` (registry identity) and `ref` (reference-by-URN).
618
+ additionalProperties: false
619
+ properties:
620
+ ref:
621
+ type: string
622
+ description: URN reference; if set, ignore other fields
623
+ urn:
624
+ type: string
625
+ pattern: "^urn:edoxen:venue:[^:]+:[^:]+$"
626
+ kind:
627
+ "$ref": "#/$defs/VenueKind"
628
+ name:
629
+ type: array
630
+ items:
631
+ "$ref": "#/$defs/LocalizedString"
632
+ label:
633
+ type: array
634
+ items:
635
+ "$ref": "#/$defs/LocalizedString"
636
+ description:
637
+ type: array
638
+ items:
639
+ "$ref": "#/$defs/LocalizedString"
640
+ capacity:
641
+ type: integer
642
+ url:
643
+ type: string
644
+ contact_methods:
645
+ type: array
646
+ items:
647
+ "$ref": "#/$defs/ContactMethod"
648
+ unlocode:
649
+ type: string
650
+ pattern: "^[A-Z]{2}[A-Z0-9]{3}$"
651
+ iata_code:
652
+ type: string
653
+ pattern: "^[A-Z]{3}$"
654
+ address:
655
+ type: array
656
+ items:
657
+ "$ref": "#/$defs/LocalizedString"
658
+ city:
659
+ type: string
660
+ country_code:
661
+ type: string
662
+ pattern: "^[A-Z]{2}$"
663
+ lat:
664
+ type: number
665
+ lon:
666
+ type: number
667
+ building:
668
+ type: array
669
+ items:
670
+ "$ref": "#/$defs/LocalizedString"
671
+ floor:
672
+ type: array
673
+ items:
674
+ "$ref": "#/$defs/LocalizedString"
675
+ room:
676
+ type: array
677
+ items:
678
+ "$ref": "#/$defs/LocalizedString"
679
+ access_notes:
680
+ type: array
681
+ items:
682
+ "$ref": "#/$defs/LocalizedString"
683
+ uri:
684
+ type: string
685
+ features:
686
+ type: array
687
+ items:
688
+ "$ref": "#/$defs/VirtualFeature"
689
+ passcode:
690
+ type: string
691
+ meeting_id:
692
+ type: string
693
+ dial_in_numbers:
694
+ type: array
695
+ items:
696
+ type: string
697
+ waiting_room:
698
+ type: boolean
699
+ registration_required:
700
+ type: boolean
701
+ extensions:
702
+ type: array
703
+ items:
704
+ "$ref": "#/$defs/MeetingExtension"
705
+ RecurrenceByDay:
706
+ type: object
707
+ description: BYDAY part of a recurrence. `ordinal` is null for 'every', +1 for first, -1 for last.
708
+ additionalProperties: false
709
+ properties:
710
+ ordinal:
711
+ type: integer
712
+ weekday:
713
+ type: string
714
+ Recurrence:
715
+ type: object
716
+ description: Structured ISO 8601-2 §13 recurrence.
717
+ additionalProperties: false
718
+ properties:
719
+ freq:
720
+ "$ref": "#/$defs/RecurrenceFreq"
721
+ interval:
722
+ type: integer
723
+ count:
724
+ type: integer
725
+ until:
726
+ type: string
727
+ format: date-time
728
+ by_day:
729
+ type: array
730
+ items:
731
+ "$ref": "#/$defs/RecurrenceByDay"
732
+ by_month_day:
733
+ type: array
734
+ items:
735
+ type: integer
736
+ by_month:
737
+ type: array
738
+ items:
739
+ type: integer
740
+ by_week_no:
741
+ type: array
742
+ items:
743
+ type: integer
744
+ by_year_day:
745
+ type: array
746
+ items:
747
+ type: integer
748
+ by_hour:
749
+ type: array
750
+ items:
751
+ type: integer
752
+ by_minute:
753
+ type: array
754
+ items:
755
+ type: integer
756
+ by_second:
757
+ type: array
758
+ items:
759
+ type: integer
760
+ by_set_pos:
761
+ type: array
762
+ items:
763
+ type: integer
764
+ week_start:
765
+ type: string
766
+ extensions:
767
+ type: array
768
+ items:
769
+ "$ref": "#/$defs/MeetingExtension"
770
+ ExtensionAttribute:
771
+ type: object
772
+ description: |
773
+ One typed key/value pair within a MeetingExtension. Polymorphic on
774
+ value type so consumers don't re-parse strings back into Int/Float/
775
+ Bool/Date (1.0 tighten, TODO.refactor/1.0-design).
776
+ additionalProperties: false
777
+ properties:
778
+ key:
779
+ type: string
298
780
  type:
299
- $ref: "#/$defs/MeetingRelationType"
300
-
301
- MeetingLocalization:
781
+ type: string
782
+ enum:
783
+ - string
784
+ - integer
785
+ - float
786
+ - boolean
787
+ - date
788
+ - datetime
789
+ value:
790
+ type: string
791
+ intValue:
792
+ type: integer
793
+ floatValue:
794
+ type: number
795
+ booleanValue:
796
+ type: boolean
797
+ dateValue:
798
+ type: string
799
+ format: date
800
+ dateTimeValue:
801
+ type: string
802
+ format: date-time
803
+ MeetingExtension:
302
804
  type: object
303
- description: "Per-language content for a Meeting."
805
+ description: |
806
+ Profile-specific extension. Adopters register their namespace via
807
+ `profile` and discriminate via `kind`. Field semantics tightened
808
+ 1.0 (TODO.refactor/1.0-design): `kind` is the in-profile discriminator,
809
+ `ref` is the URN of an external profile document, and the
810
+ recursive `extensions[]` slot was removed (YAGNI — use dotted
811
+ keys in `attributes[]` for nesting).
304
812
  additionalProperties: false
305
- required: [language_code]
306
813
  properties:
307
- language_code:
814
+ profile:
308
815
  type: string
309
- pattern: "^[a-z]{3}$"
310
- script:
816
+ kind:
311
817
  type: string
312
- pattern: "^[A-Z][a-z]{3}$"
313
- title: { type: string }
314
- general_area: { type: string }
315
- practical_info: { type: string }
316
-
818
+ ref:
819
+ type: string
820
+ attributes:
821
+ type: array
822
+ items:
823
+ "$ref": "#/$defs/ExtensionAttribute"
824
+ Officer:
825
+ type: object
826
+ description: A person holding a structural role in a Meeting.
827
+ additionalProperties: false
828
+ properties:
829
+ role:
830
+ "$ref": "#/$defs/OfficerRole"
831
+ person:
832
+ "$ref": "#/$defs/Person"
833
+ term_start:
834
+ type: string
835
+ format: date
836
+ term_end:
837
+ type: string
838
+ format: date
839
+ extensions:
840
+ type: array
841
+ items:
842
+ "$ref": "#/$defs/MeetingExtension"
843
+ MeetingComponent:
844
+ type: object
845
+ description: 'Flat sub-event of a Meeting. 1.0: per-field Localized.'
846
+ additionalProperties: false
847
+ properties:
848
+ identifier:
849
+ type: string
850
+ urn:
851
+ type: string
852
+ kind:
853
+ "$ref": "#/$defs/ComponentKind"
854
+ body_type:
855
+ type: string
856
+ title:
857
+ type: array
858
+ items:
859
+ "$ref": "#/$defs/LocalizedString"
860
+ description:
861
+ type: array
862
+ items:
863
+ "$ref": "#/$defs/LocalizedString"
864
+ starts_at:
865
+ type: string
866
+ format: date-time
867
+ ends_at:
868
+ type: string
869
+ format: date-time
870
+ time_label:
871
+ type: array
872
+ items:
873
+ "$ref": "#/$defs/LocalizedString"
874
+ venue_refs:
875
+ type: array
876
+ items:
877
+ type: string
878
+ officers:
879
+ type: array
880
+ items:
881
+ "$ref": "#/$defs/Officer"
882
+ agenda_ref:
883
+ type: string
884
+ minutes_ref:
885
+ type: string
886
+ attendance_refs:
887
+ type: array
888
+ items:
889
+ type: string
890
+ extensions:
891
+ type: array
892
+ items:
893
+ "$ref": "#/$defs/MeetingExtension"
894
+ MeetingSeries:
895
+ type: object
896
+ description: 'Parent of recurring Meeting instances. 1.0: per-field Localized.'
897
+ additionalProperties: false
898
+ properties:
899
+ identifier:
900
+ type: array
901
+ items:
902
+ "$ref": "#/$defs/StructuredIdentifier"
903
+ urn:
904
+ type: string
905
+ name:
906
+ type: array
907
+ items:
908
+ "$ref": "#/$defs/LocalizedString"
909
+ description:
910
+ type: array
911
+ items:
912
+ "$ref": "#/$defs/LocalizedString"
913
+ recurrence:
914
+ "$ref": "#/$defs/Recurrence"
915
+ term:
916
+ type: string
917
+ contact:
918
+ "$ref": "#/$defs/Contact"
919
+ hosts:
920
+ type: array
921
+ items:
922
+ "$ref": "#/$defs/HostRef"
923
+ kind:
924
+ type: string
925
+ meeting_refs:
926
+ type: array
927
+ items:
928
+ type: string
929
+ extensions:
930
+ type: array
931
+ items:
932
+ "$ref": "#/$defs/MeetingExtension"
933
+ body_type:
934
+ type: string
935
+ MeetingRelation:
936
+ type: object
937
+ description: Directed link between two meetings.
938
+ additionalProperties: false
939
+ required:
940
+ - source
941
+ - destination
942
+ - type
943
+ properties:
944
+ source:
945
+ "$ref": "#/$defs/StructuredIdentifier"
946
+ destination:
947
+ "$ref": "#/$defs/StructuredIdentifier"
948
+ type:
949
+ "$ref": "#/$defs/MeetingRelationType"
317
950
  Meeting:
318
951
  type: object
319
- description: "A single Meeting (event)."
952
+ description: 'A single Meeting (event). 1.0: per-field Localized.'
320
953
  additionalProperties: false
321
- required: [identifier, type]
954
+ required:
955
+ - identifier
956
+ - type
322
957
  properties:
323
958
  identifier:
324
959
  type: array
325
960
  minItems: 1
326
961
  items:
327
- $ref: "#/$defs/StructuredIdentifier"
328
- urn: { type: string }
329
- ordinal: { type: integer }
962
+ "$ref": "#/$defs/StructuredIdentifier"
963
+ urn:
964
+ type: string
965
+ ordinal:
966
+ type: integer
967
+ series_ref:
968
+ type: string
330
969
  type:
331
- $ref: "#/$defs/MeetingType"
970
+ "$ref": "#/$defs/MeetingType"
332
971
  status:
333
- $ref: "#/$defs/MeetingStatus"
334
- year: { type: integer }
335
-
336
- date_range:
337
- $ref: "#/$defs/DateRange"
338
-
339
- committee: { type: string }
340
- committee_group: { type: string }
341
-
972
+ "$ref": "#/$defs/MeetingStatus"
973
+ visibility:
974
+ "$ref": "#/$defs/Visibility"
975
+ body_type:
976
+ type: string
977
+ title:
978
+ type: array
979
+ items:
980
+ "$ref": "#/$defs/LocalizedString"
981
+ scheduled_date_range:
982
+ "$ref": "#/$defs/DateRange"
983
+ occurred_date_range:
984
+ "$ref": "#/$defs/DateTimeRange"
985
+ recurrence:
986
+ "$ref": "#/$defs/Recurrence"
342
987
  venues:
343
988
  type: array
344
989
  items:
345
- $ref: "#/$defs/Location"
346
- general_area: { type: string }
990
+ "$ref": "#/$defs/Venue"
991
+ general_area:
992
+ type: array
993
+ items:
994
+ "$ref": "#/$defs/LocalizedString"
995
+ practical_info:
996
+ type: array
997
+ items:
998
+ "$ref": "#/$defs/LocalizedString"
347
999
  city:
348
1000
  type: string
349
1001
  pattern: "^[A-Z]{2}[A-Z0-9]{3}$"
350
- description: "UN/LOCODE of the host city (5-char: 2-letter ISO 3166-1 country + 3-char location, e.g. FRPAR, HKHKG, THCNM)."
351
1002
  country_code:
352
1003
  type: string
353
1004
  pattern: "^[A-Z]{2}$"
354
- virtual: { type: boolean }
355
-
356
- chair: { $ref: "#/$defs/Person" }
357
- secretary: { $ref: "#/$defs/Person" }
358
- host: { type: string }
1005
+ committee:
1006
+ type: string
1007
+ committee_group:
1008
+ type: string
1009
+ officers:
1010
+ type: array
1011
+ items:
1012
+ "$ref": "#/$defs/Officer"
359
1013
  hosts:
360
1014
  type: array
361
1015
  items:
362
- $ref: "#/$defs/HostRef"
363
-
1016
+ "$ref": "#/$defs/HostRef"
364
1017
  source_urls:
365
1018
  type: array
366
1019
  items:
367
- $ref: "#/$defs/SourceUrl"
368
- landing_url: { type: string }
369
- registration_url: { type: string }
370
-
1020
+ "$ref": "#/$defs/SourceUrl"
1021
+ landing_url:
1022
+ type: string
1023
+ registration_url:
1024
+ type: string
1025
+ note:
1026
+ type: array
1027
+ items:
1028
+ "$ref": "#/$defs/LocalizedString"
1029
+ contact:
1030
+ "$ref": "#/$defs/Contact"
371
1031
  agenda:
372
- $ref: "#/$defs/Agenda"
373
- schedule:
1032
+ "$ref": "#/$defs/Agenda"
1033
+ components:
374
1034
  type: array
375
1035
  items:
376
- $ref: "#/$defs/ScheduleItem"
1036
+ "$ref": "#/$defs/MeetingComponent"
377
1037
  deadlines:
378
1038
  type: array
379
1039
  items:
380
- $ref: "#/$defs/Deadline"
1040
+ "$ref": "#/$defs/Deadline"
381
1041
  attendance:
382
1042
  type: array
383
1043
  items:
384
- $ref: "#/$defs/Attendance"
385
- vote_records:
1044
+ "$ref": "#/$defs/Attendance"
1045
+ minutes:
386
1046
  type: array
387
1047
  items:
388
- $ref: "#/$defs/VoteRecord"
389
- minutes:
1048
+ "$ref": "#/$defs/Minutes"
1049
+ declarations:
390
1050
  type: array
391
1051
  items:
392
- $ref: "#/$defs/Minutes"
393
-
394
- localizations:
1052
+ "$ref": "#/$defs/Declaration"
1053
+ decisions:
1054
+ type: array
1055
+ items:
1056
+ "$ref": "#/$defs/StructuredIdentifier"
1057
+ motions:
1058
+ type: array
1059
+ items:
1060
+ "$ref": "#/$defs/StructuredIdentifier"
1061
+ votings:
395
1062
  type: array
396
1063
  items:
397
- $ref: "#/$defs/MeetingLocalization"
1064
+ "$ref": "#/$defs/StructuredIdentifier"
398
1065
  relations:
399
1066
  type: array
400
1067
  items:
401
- $ref: "#/$defs/MeetingRelation"
402
- resolution_refs:
1068
+ "$ref": "#/$defs/MeetingRelation"
1069
+ extensions:
403
1070
  type: array
404
- items: { type: string }
405
-
1071
+ items:
1072
+ "$ref": "#/$defs/MeetingExtension"
406
1073
  MeetingCollectionMetadata:
407
1074
  type: object
408
- description: "Display-level metadata for a MeetingCollection."
1075
+ description: 'Display-level metadata for a MeetingCollection. 1.0: per-field Localized.'
409
1076
  additionalProperties: false
410
1077
  properties:
411
- title: { type: string }
412
- source: { type: string }
413
-
1078
+ title:
1079
+ type: array
1080
+ items:
1081
+ "$ref": "#/$defs/LocalizedString"
1082
+ source:
1083
+ type: string
1084
+ body_vocabulary:
1085
+ type: array
1086
+ items:
1087
+ "$ref": "#/$defs/BodyVocabularyEntry"
1088
+ BodyVocabularyEntry:
1089
+ type: object
1090
+ description: |
1091
+ One entry in a per-dataset body_vocabulary list. Maps a free-form
1092
+ body_type to a short canonical value. SSOT for body_type ->
1093
+ canonical_type resolution within the declaring collection.
1094
+ additionalProperties: false
1095
+ properties:
1096
+ body_type:
1097
+ type: string
1098
+ canonical_type:
1099
+ type: string
1100
+ definition:
1101
+ type: string
414
1102
  MeetingCollection:
415
1103
  type: object
416
- description: "Top-level wrapper for many Meetings in one file."
1104
+ description: Top-level wrapper for many Meetings in one file.
417
1105
  additionalProperties: false
418
- required: [meetings]
1106
+ required:
1107
+ - meetings
419
1108
  properties:
420
1109
  metadata:
421
- $ref: "#/$defs/MeetingCollectionMetadata"
1110
+ "$ref": "#/$defs/MeetingCollectionMetadata"
422
1111
  meetings:
423
1112
  type: array
424
1113
  items:
425
- $ref: "#/$defs/Meeting"
426
-
427
- # ====================================================================
428
- # Enums. Each value-list must equal the matching Edoxen::Enums::*
429
- # frozen array; spec/edoxen/schema_meeting_enum_sync_spec.rb enforces.
430
- # ====================================================================
431
-
1114
+ "$ref": "#/$defs/Meeting"
432
1115
  MeetingType:
433
1116
  type: string
434
- description: "Edoxen::Enums::MEETING_TYPE."
435
- enum: [plenary, working_group, task_group, ad_hoc, joint, conference_session]
436
-
1117
+ description: Edoxen::Enums::MEETING_TYPE.
1118
+ enum:
1119
+ - plenary
1120
+ - working_group
1121
+ - task_group
1122
+ - ad_hoc
1123
+ - joint
1124
+ - general_assembly
1125
+ - committee
1126
+ - subcommittee
1127
+ - conference
1128
+ - workshop
1129
+ - seminar
1130
+ - webinar
1131
+ - hearing
1132
+ - markup
1133
+ - board_meeting
1134
+ - annual_general_meeting
1135
+ - other
1136
+ MeetingTypeCanonical:
1137
+ type: string
1138
+ description: |
1139
+ Edoxen::Enums::MEETING_TYPE_CANONICAL — short abstract set (1.0,
1140
+ TODO.refactor/1.0-design). No `other` escape — bodies pick the closest
1141
+ fit and use `body_type` for body-specific terminology.
1142
+ enum:
1143
+ - plenary
1144
+ - governing
1145
+ - working
1146
+ - advisory
437
1147
  MeetingStatus:
438
1148
  type: string
439
- description: "Edoxen::Enums::MEETING_STATUS."
440
- enum: [upcoming, completed, cancelled]
441
-
1149
+ description: Edoxen::Enums::MEETING_STATUS.
1150
+ enum:
1151
+ - upcoming
1152
+ - completed
1153
+ - cancelled
442
1154
  AgendaStatus:
443
1155
  type: string
444
- description: "Edoxen::Enums::AGENDA_STATUS."
445
- enum: [draft, final, amended, cancelled, superseded]
446
-
1156
+ description: Edoxen::Enums::AGENDA_STATUS.
1157
+ enum:
1158
+ - draft
1159
+ - final
1160
+ - amended
1161
+ - cancelled
1162
+ - superseded
447
1163
  AgendaItemKind:
448
1164
  type: string
449
- description: "Edoxen::Enums::AGENDA_ITEM_KIND."
450
- enum: [numbered, unnumbered, header, opening, closing]
451
-
1165
+ description: Edoxen::Enums::AGENDA_ITEM_KIND.
1166
+ enum:
1167
+ - numbered
1168
+ - unnumbered
1169
+ - header
1170
+ - opening
1171
+ - closing
1172
+ - aob
452
1173
  AgendaItemOutcome:
453
1174
  type: string
454
- description: "Edoxen::Enums::AGENDA_ITEM_OUTCOME."
455
- enum: [discussed, resolved, deferred, adopted, withdrawn]
456
-
1175
+ description: Edoxen::Enums::AGENDA_ITEM_OUTCOME.
1176
+ enum:
1177
+ - discussed
1178
+ - resolved
1179
+ - deferred
1180
+ - adopted
1181
+ - withdrawn
1182
+ - carried
1183
+ - negatived
457
1184
  HostType:
458
1185
  type: string
459
- description: "Edoxen::Enums::HOST_TYPE."
460
- enum: [national_body, liaison, associate, organizer]
461
-
1186
+ description: Edoxen::Enums::HOST_TYPE.
1187
+ enum:
1188
+ - national_body
1189
+ - liaison
1190
+ - associate
1191
+ - organizer
462
1192
  MeetingRelationType:
463
1193
  type: string
464
- description: "Edoxen::Enums::MEETING_RELATION_TYPE."
465
- enum: [continues_from, continues_to, joint_with, supersedes, superseded_by, rescheduled_from, rescheduled_to]
466
-
1194
+ description: Edoxen::Enums::MEETING_RELATION_TYPE.
1195
+ enum:
1196
+ - continues_from
1197
+ - continues_to
1198
+ - joint_with
1199
+ - supersedes
1200
+ - superseded_by
1201
+ - rescheduled_from
1202
+ - rescheduled_to
1203
+ - parent_of
1204
+ - child_of
1205
+ - sibling_of
1206
+ - depends_on
1207
+ - finish_to_start
1208
+ - finish_to_finish
1209
+ - start_to_start
1210
+ - start_to_finish
467
1211
  SourceUrlKind:
468
1212
  type: string
469
- description: "Edoxen::Enums::SOURCE_URL_KIND."
470
- enum: [agenda_pdf, minutes_pdf, resolutions_pdf, report_pdf, register_url, landing_page]
471
-
1213
+ description: Edoxen::Enums::SOURCE_URL_KIND.
1214
+ enum:
1215
+ - agenda_pdf
1216
+ - minutes_pdf
1217
+ - decisions_pdf
1218
+ - report_pdf
1219
+ - register_url
1220
+ - landing_page
472
1221
  ParticipationStatus:
473
1222
  type: string
474
- description: "Edoxen::Enums::PARTICIPATION_STATUS."
475
- enum: [present, absent, apologies, observer, excused]
476
-
1223
+ description: Edoxen::Enums::PARTICIPATION_STATUS.
1224
+ enum:
1225
+ - present
1226
+ - absent
1227
+ - apologies
1228
+ - observer
1229
+ - excused
1230
+ AttendanceRole:
1231
+ type: string
1232
+ description: Edoxen::Enums::ATTENDANCE_ROLE.
1233
+ enum:
1234
+ - chair
1235
+ - required
1236
+ - optional
1237
+ - non_participant
1238
+ AttendanceResponse:
1239
+ type: string
1240
+ description: Edoxen::Enums::ATTENDANCE_RESPONSE.
1241
+ enum:
1242
+ - pending
1243
+ - confirmed
1244
+ - declined
1245
+ - tentative
1246
+ - delegated
477
1247
  VoteType:
478
1248
  type: string
479
- description: "Edoxen::Enums::VOTE_TYPE."
480
- enum: [affirmative, negative, abstain, absent, not_applicable]
1249
+ description: Edoxen::Enums::VOTE_TYPE.
1250
+ enum:
1251
+ - affirmative
1252
+ - negative
1253
+ - abstain
1254
+ - absent
1255
+ - not_applicable
1256
+ TopicStatus:
1257
+ type: string
1258
+ description: Edoxen::Enums::TOPIC_STATUS.
1259
+ enum:
1260
+ - open
1261
+ - under_discussion
1262
+ - decided
1263
+ - deferred
1264
+ - withdrawn
1265
+ VenueKind:
1266
+ type: string
1267
+ description: Edoxen::Enums::VENUE_KIND.
1268
+ enum:
1269
+ - physical
1270
+ - virtual
1271
+ VirtualFeature:
1272
+ type: string
1273
+ description: Edoxen::Enums::VIRTUAL_FEATURE.
1274
+ enum:
1275
+ - audio
1276
+ - video
1277
+ - chat
1278
+ - phone
1279
+ - screen
1280
+ - feed
1281
+ Visibility:
1282
+ type: string
1283
+ description: Edoxen::Enums::VISIBILITY.
1284
+ enum:
1285
+ - public
1286
+ - private
1287
+ - confidential
1288
+ ComponentKind:
1289
+ type: string
1290
+ description: Edoxen::Enums::COMPONENT_KIND.
1291
+ enum:
1292
+ - track
1293
+ - session
1294
+ - debate
1295
+ - breakout
1296
+ - bof
1297
+ - plenary_session
1298
+ - working_group_session
1299
+ - committee_of_the_whole
1300
+ - keynote
1301
+ - address
1302
+ - statement
1303
+ - question_time
1304
+ - opening
1305
+ - closing
1306
+ - break
1307
+ - reception
1308
+ - registration
1309
+ - networking
1310
+ - other
1311
+ OfficerRole:
1312
+ type: string
1313
+ description: Edoxen::Enums::OFFICER_ROLE.
1314
+ enum:
1315
+ - chair
1316
+ - vice_chair
1317
+ - deputy_chair
1318
+ - secretary
1319
+ - treasurer
1320
+ - parliamentarian
1321
+ - presiding_officer
1322
+ - sergeant_at_arms
1323
+ - other
1324
+ RecurrenceFreq:
1325
+ type: string
1326
+ description: Edoxen::Enums::RECURRENCE_FREQ.
1327
+ enum:
1328
+ - secondly
1329
+ - minutely
1330
+ - hourly
1331
+ - daily
1332
+ - weekly
1333
+ - monthly
1334
+ - yearly
1335
+ DateTimeRange:
1336
+ type: object
1337
+ description: |
1338
+ Start + end pair with sub-day precision. Parallel to DateRange;
1339
+ use when day granularity is insufficient (e.g. a meeting that
1340
+ ran 09:00–11:30).
1341
+ additionalProperties: false
1342
+ properties:
1343
+ start:
1344
+ type: string
1345
+ format: date-time
1346
+ end:
1347
+ type: string
1348
+ format: date-time
1349
+ StatementKind:
1350
+ type: string
1351
+ description: |
1352
+ Discriminator for the three BS 0:2006 statement types. Adding a
1353
+ new kind is a one-line enum extension; the Statement model
1354
+ itself never needs to change (OCP).
1355
+ enum:
1356
+ - statement
1357
+ - comment
1358
+ - standpoint
1359
+ DeclarationKind:
1360
+ type: string
1361
+ description: |
1362
+ Discriminator for the two BS 0:2006 declaration types
1363
+ (conflict of interest, IPR).
1364
+ enum:
1365
+ - conflict_of_interest
1366
+ - ipr
1367
+ Statement:
1368
+ type: object
1369
+ description: |
1370
+ One remark made by one or more meeting members on a topic or a
1371
+ minutes section. Per-field Localized description; party is a
1372
+ list of Person references. The `kind` discriminator separates
1373
+ the three BS 0:2006 statement types.
1374
+ additionalProperties: false
1375
+ properties:
1376
+ kind:
1377
+ "$ref": "#/$defs/StatementKind"
1378
+ description:
1379
+ type: array
1380
+ items:
1381
+ "$ref": "#/$defs/LocalizedString"
1382
+ party:
1383
+ type: array
1384
+ items:
1385
+ "$ref": "#/$defs/Person"
1386
+ extensions:
1387
+ type: array
1388
+ items:
1389
+ "$ref": "#/$defs/MeetingExtension"
1390
+ Declaration:
1391
+ type: object
1392
+ description: |
1393
+ A formal declaration (conflict of interest or IPR) made by one
1394
+ or more meeting members. IPR-specific fields (`ipr_subject_ref`,
1395
+ `ipr_target_ref`) are populated only when `kind == "ipr"`.
1396
+ additionalProperties: false
1397
+ properties:
1398
+ kind:
1399
+ "$ref": "#/$defs/DeclarationKind"
1400
+ description:
1401
+ type: array
1402
+ items:
1403
+ "$ref": "#/$defs/LocalizedString"
1404
+ party:
1405
+ type: array
1406
+ items:
1407
+ "$ref": "#/$defs/Person"
1408
+ ipr_subject_ref:
1409
+ "$ref": "#/$defs/EntityRef"
1410
+ ipr_target_ref:
1411
+ "$ref": "#/$defs/EntityRef"
1412
+ extensions:
1413
+ type: array
1414
+ items:
1415
+ "$ref": "#/$defs/MeetingExtension"