edoxen 0.5.0 → 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 (90) 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/CLAUDE.md +10 -6
  6. data/Gemfile +4 -0
  7. data/README.adoc +417 -181
  8. data/TODO.meeting-agenda/02-lutaml-canonical.md +1 -1
  9. data/TODO.meeting-agenda/09-verify-and-release.md +3 -3
  10. data/TODO.meeting-agenda/README.md +2 -2
  11. data/edoxen.gemspec +10 -9
  12. data/lib/edoxen/action.rb +5 -4
  13. data/lib/edoxen/agenda.rb +4 -7
  14. data/lib/edoxen/agenda_item.rb +12 -5
  15. data/lib/edoxen/approval.rb +2 -2
  16. data/lib/edoxen/attendance.rb +29 -0
  17. data/lib/edoxen/body_vocabulary_entry.rb +24 -0
  18. data/lib/edoxen/body_vocabulary_host.rb +40 -0
  19. data/lib/edoxen/cli.rb +186 -108
  20. data/lib/edoxen/consideration.rb +6 -4
  21. data/lib/edoxen/contact.rb +35 -0
  22. data/lib/edoxen/contact_collection.rb +26 -0
  23. data/lib/edoxen/contact_identifier.rb +13 -0
  24. data/lib/edoxen/contact_method.rb +16 -0
  25. data/lib/edoxen/date_time_range.rb +16 -0
  26. data/lib/edoxen/deadline.rb +1 -1
  27. data/lib/edoxen/decision.rb +57 -0
  28. data/lib/edoxen/decision_collection.rb +10 -0
  29. data/lib/edoxen/decision_date.rb +9 -0
  30. data/lib/edoxen/decision_metadata.rb +27 -0
  31. data/lib/edoxen/decision_relation.rb +11 -0
  32. data/lib/edoxen/declaration.rb +25 -0
  33. data/lib/edoxen/entity_ref.rb +74 -0
  34. data/lib/edoxen/enums.rb +129 -8
  35. data/lib/edoxen/error.rb +1 -1
  36. data/lib/edoxen/extension_attribute.rb +78 -0
  37. data/lib/edoxen/host_ref.rb +1 -1
  38. data/lib/edoxen/link_checker.rb +194 -0
  39. data/lib/edoxen/localized_name.rb +16 -0
  40. data/lib/edoxen/localized_string.rb +22 -0
  41. data/lib/edoxen/meeting.rb +42 -36
  42. data/lib/edoxen/meeting_collection.rb +1 -2
  43. data/lib/edoxen/meeting_collection_metadata.rb +4 -2
  44. data/lib/edoxen/meeting_component.rb +37 -0
  45. data/lib/edoxen/meeting_extension.rb +25 -0
  46. data/lib/edoxen/meeting_identifier.rb +1 -1
  47. data/lib/edoxen/meeting_series.rb +26 -0
  48. data/lib/edoxen/minutes.rb +30 -0
  49. data/lib/edoxen/minutes_section.rb +26 -0
  50. data/lib/edoxen/motion.rb +51 -0
  51. data/lib/edoxen/name.rb +29 -0
  52. data/lib/edoxen/officer.rb +19 -0
  53. data/lib/edoxen/officers_host.rb +19 -0
  54. data/lib/edoxen/person.rb +5 -9
  55. data/lib/edoxen/physical_venue.rb +15 -0
  56. data/lib/edoxen/recurrence.rb +27 -0
  57. data/lib/edoxen/recurrence_by_day.rb +10 -0
  58. data/lib/edoxen/reference.rb +1 -1
  59. data/lib/edoxen/reference_data.rb +85 -0
  60. data/lib/edoxen/schema_validator.rb +3 -4
  61. data/lib/edoxen/source_url.rb +4 -4
  62. data/lib/edoxen/statement.rb +21 -0
  63. data/lib/edoxen/structured_identifier.rb +2 -2
  64. data/lib/edoxen/topic.rb +39 -0
  65. data/lib/edoxen/topic_asset.rb +14 -0
  66. data/lib/edoxen/topic_document.rb +16 -0
  67. data/lib/edoxen/venue.rb +79 -0
  68. data/lib/edoxen/venue_collection.rb +18 -0
  69. data/lib/edoxen/venue_validator.rb +74 -0
  70. data/lib/edoxen/version.rb +1 -1
  71. data/lib/edoxen/virtual_venue.rb +15 -0
  72. data/lib/edoxen/vote_record.rb +29 -0
  73. data/lib/edoxen/voting.rb +45 -0
  74. data/lib/edoxen/voting_counts.rb +23 -0
  75. data/lib/edoxen.rb +53 -14
  76. data/schema/edoxen.yaml +1378 -247
  77. data/schema/meeting.yaml +1258 -201
  78. data/sig/edoxen.rbs +581 -1
  79. metadata +82 -21
  80. data/lib/edoxen/_metadata.rb.deprecated +0 -57
  81. data/lib/edoxen/localization.rb +0 -18
  82. data/lib/edoxen/location.rb +0 -15
  83. data/lib/edoxen/meeting_localization.rb +0 -15
  84. data/lib/edoxen/resolution.rb +0 -43
  85. data/lib/edoxen/resolution_collection.rb +0 -10
  86. data/lib/edoxen/resolution_date.rb +0 -11
  87. data/lib/edoxen/resolution_metadata.rb +0 -22
  88. data/lib/edoxen/resolution_relation.rb +0 -11
  89. data/lib/edoxen/resolution_set.rb +0 -17
  90. data/lib/edoxen/schedule_item.rb +0 -16
data/schema/meeting.yaml CHANGED
@@ -1,12 +1,12 @@
1
1
  ---
2
- $schema: "http://json-schema.org/draft-07/schema#"
3
- $id: "https://github.com/metanorma/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
 
8
8
  Mirrors the canonical LutaML information model in
9
- https://github.com/metanorma/edoxen-model/tree/main/models (meeting*.lutaml,
9
+ https://github.com/edoxen/edoxen-model/tree/main/models (meeting*.lutaml,
10
10
  agenda*.lutaml, etc.).
11
11
 
12
12
  The root accepts either a single Meeting or a MeetingCollection.
@@ -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,102 +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
-
107
+ spelling:
108
+ type: string
109
+ value:
110
+ type: string
111
+ extensions:
112
+ type: array
113
+ items:
114
+ "$ref": "#/$defs/MeetingExtension"
115
+ LocalizedName:
116
+ type: object
117
+ description: |
118
+ One language-specific value of a translatable Name field.
119
+ Mirrors LocalizedString but carries a structured Name.
120
+ additionalProperties: false
121
+ required:
122
+ - spelling
123
+ - value
124
+ properties:
125
+ spelling:
126
+ type: string
127
+ value:
128
+ "$ref": "#/$defs/Name"
129
+ extensions:
130
+ type: array
131
+ items:
132
+ "$ref": "#/$defs/MeetingExtension"
133
+ ContactMethod:
134
+ type: object
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).
141
+ additionalProperties: false
142
+ properties:
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:
167
+ type: object
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).
173
+ additionalProperties: false
174
+ properties:
175
+ kind:
176
+ "$ref": "#/$defs/ContactIdentifierKind"
177
+ value:
178
+ type: string
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:
193
+ type: string
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:
209
+ type: object
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).
214
+ additionalProperties: false
215
+ properties:
216
+ ref:
217
+ type: string
218
+ description: URN reference; if set, ignore other fields
219
+ urn:
220
+ type: string
221
+ pattern: "^urn:edoxen:contact:[^:]+:[^:]+$"
222
+ name:
223
+ type: array
224
+ items:
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"
82
254
  Person:
83
255
  type: object
84
- description: "Identity + role + affiliation + contact."
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.
85
260
  additionalProperties: false
86
261
  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
-
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"
94
299
  HostRef:
95
300
  type: object
96
- description: "Typed reference to an organization that hosts or co-organizes a meeting."
301
+ description: Typed reference to a hosting organization.
97
302
  additionalProperties: false
98
- required: [ref]
303
+ required:
304
+ - ref
99
305
  properties:
100
- ref: { type: string }
306
+ ref:
307
+ type: string
101
308
  type:
102
- $ref: "#/$defs/HostType"
103
- role: { type: string }
309
+ "$ref": "#/$defs/HostType"
310
+ role:
311
+ type: string
104
312
  contact:
105
- $ref: "#/$defs/Person"
106
-
107
- ScheduleItem:
313
+ "$ref": "#/$defs/Contact"
314
+ Attendance:
108
315
  type: object
109
- description: "One entry in the meeting timetable."
316
+ description: One attendance record per person at a Meeting.
110
317
  additionalProperties: false
318
+ required:
319
+ - person
320
+ - status
111
321
  properties:
112
- date:
322
+ person:
323
+ "$ref": "#/$defs/Person"
324
+ status:
325
+ "$ref": "#/$defs/ParticipationStatus"
326
+ role:
327
+ "$ref": "#/$defs/AttendanceRole"
328
+ response:
329
+ "$ref": "#/$defs/AttendanceResponse"
330
+ affiliation:
113
331
  type: string
114
- format: date
115
- time: { type: string }
116
- event: { type: string }
117
- description: { type: string }
118
- room: { type: string }
119
-
332
+ proxy_for:
333
+ "$ref": "#/$defs/Person"
334
+ notes:
335
+ type: string
336
+ extensions:
337
+ type: array
338
+ items:
339
+ "$ref": "#/$defs/MeetingExtension"
340
+ VoteRecord:
341
+ type: object
342
+ description: One vote by one person on one decision/voting.
343
+ additionalProperties: false
344
+ required:
345
+ - person
346
+ - vote
347
+ properties:
348
+ decision_ref:
349
+ type: string
350
+ voting_ref:
351
+ type: string
352
+ person:
353
+ "$ref": "#/$defs/Person"
354
+ affiliation:
355
+ type: string
356
+ vote:
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"
366
+ MinutesSection:
367
+ type: object
368
+ description: 'One section of a Meeting''s minutes — typically tied to an agenda item by `number`. 1.0: per-field Localized.'
369
+ additionalProperties: false
370
+ properties:
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
385
+ references:
386
+ type: array
387
+ items:
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`.
399
+ Minutes:
400
+ type: object
401
+ description: |
402
+ The narrative record of a Meeting. 1.0: per-document language_code
403
+ + script replaced by a single `spelling` (ISO 24229).
404
+ additionalProperties: false
405
+ properties:
406
+ identifier:
407
+ type: array
408
+ items:
409
+ "$ref": "#/$defs/StructuredIdentifier"
410
+ urn:
411
+ type: string
412
+ spelling:
413
+ type: string
414
+ description: ISO 24229 spelling/conversion system code
415
+ source_doc:
416
+ type: string
417
+ source_pages:
418
+ type: string
419
+ sections:
420
+ type: array
421
+ items:
422
+ "$ref": "#/$defs/MinutesSection"
120
423
  Deadline:
121
424
  type: object
122
- description: "A time-bound requirement (registration, submission, etc.)."
425
+ description: 'A time-bound requirement. 1.0: per-field Localized.'
123
426
  additionalProperties: false
124
- required: [date]
427
+ required:
428
+ - date
125
429
  properties:
126
430
  date:
127
431
  type: string
128
432
  format: date
129
- description: { type: string }
130
-
433
+ description:
434
+ type: array
435
+ items:
436
+ "$ref": "#/$defs/LocalizedString"
131
437
  Reference:
132
438
  type: object
133
- description: "Generic document reference (used by AgendaItem.references)."
439
+ description: Generic document reference.
134
440
  additionalProperties: false
135
441
  properties:
136
- ref: { type: string }
137
- kind: { type: string }
138
- title: { type: string }
139
-
140
- # ====================================================================
141
- # Agenda side.
142
- # ====================================================================
143
-
442
+ ref:
443
+ type: string
444
+ kind:
445
+ type: string
446
+ title:
447
+ type: array
448
+ items:
449
+ "$ref": "#/$defs/LocalizedString"
144
450
  AgendaItem:
145
451
  type: object
146
- description: "One entry on an Agenda."
452
+ description: 'One entry on an Agenda. 1.0: per-field Localized.'
147
453
  additionalProperties: false
148
454
  properties:
149
- label: { type: string }
455
+ label:
456
+ type: string
150
457
  kind:
151
- $ref: "#/$defs/AgendaItemKind"
152
- title: { type: string }
153
- 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"
154
467
  references:
155
468
  type: array
156
469
  items:
157
- $ref: "#/$defs/Reference"
470
+ "$ref": "#/$defs/Reference"
158
471
  outcome:
159
- $ref: "#/$defs/AgendaItemOutcome"
160
- resolution_ref:
472
+ "$ref": "#/$defs/AgendaItemOutcome"
473
+ decision_ref:
161
474
  type: string
162
- description: "URN of the resolution this item produced."
163
-
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"
164
487
  Agenda:
165
488
  type: object
166
489
  description: |
@@ -171,188 +494,922 @@ $defs:
171
494
  identifier:
172
495
  type: array
173
496
  items:
174
- $ref: "#/$defs/StructuredIdentifier"
497
+ "$ref": "#/$defs/StructuredIdentifier"
175
498
  status:
176
- $ref: "#/$defs/AgendaStatus"
177
- source_doc: { type: string }
499
+ "$ref": "#/$defs/AgendaStatus"
500
+ source_doc:
501
+ type: string
178
502
  items:
179
503
  type: array
180
504
  items:
181
- $ref: "#/$defs/AgendaItem"
182
- opening_session:
183
- $ref: "#/$defs/ScheduleItem"
184
- closing_session:
185
- $ref: "#/$defs/ScheduleItem"
186
-
187
- # ====================================================================
188
- # Meeting side.
189
- # ====================================================================
190
-
191
- MeetingRelation:
505
+ "$ref": "#/$defs/AgendaItem"
506
+ extensions:
507
+ type: array
508
+ items:
509
+ "$ref": "#/$defs/MeetingExtension"
510
+ TopicDocument:
192
511
  type: object
193
- description: "Directed link between two meetings."
512
+ description: 'Text-bearing document about a Topic. 1.0: per-field Localized.'
194
513
  additionalProperties: false
195
- required: [source, destination, type]
196
514
  properties:
197
- source:
198
- $ref: "#/$defs/StructuredIdentifier"
199
- destination:
200
- $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
201
780
  type:
202
- $ref: "#/$defs/MeetingRelationType"
203
-
204
- 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:
205
804
  type: object
206
- 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).
207
812
  additionalProperties: false
208
- required: [language_code]
209
813
  properties:
210
- language_code:
814
+ profile:
815
+ type: string
816
+ kind:
211
817
  type: string
212
- pattern: "^[a-z]{3}$"
213
- script:
818
+ ref:
214
819
  type: string
215
- pattern: "^[A-Z][a-z]{3}$"
216
- title: { type: string }
217
- general_area: { type: string }
218
- practical_info: { type: string }
219
-
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"
220
950
  Meeting:
221
951
  type: object
222
- description: "A single Meeting (event)."
952
+ description: 'A single Meeting (event). 1.0: per-field Localized.'
223
953
  additionalProperties: false
224
- required: [identifier, type]
954
+ required:
955
+ - identifier
956
+ - type
225
957
  properties:
226
958
  identifier:
227
959
  type: array
228
960
  minItems: 1
229
961
  items:
230
- $ref: "#/$defs/StructuredIdentifier"
231
- urn: { type: string }
232
- ordinal: { type: integer }
962
+ "$ref": "#/$defs/StructuredIdentifier"
963
+ urn:
964
+ type: string
965
+ ordinal:
966
+ type: integer
967
+ series_ref:
968
+ type: string
233
969
  type:
234
- $ref: "#/$defs/MeetingType"
970
+ "$ref": "#/$defs/MeetingType"
235
971
  status:
236
- $ref: "#/$defs/MeetingStatus"
237
- year: { type: integer }
238
-
239
- date_range:
240
- $ref: "#/$defs/DateRange"
241
-
242
- committee: { type: string }
243
- committee_group: { type: string }
244
-
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"
245
987
  venues:
246
988
  type: array
247
989
  items:
248
- $ref: "#/$defs/Location"
249
- general_area: { type: string }
250
- city: { 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"
999
+ city:
1000
+ type: string
1001
+ pattern: "^[A-Z]{2}[A-Z0-9]{3}$"
251
1002
  country_code:
252
1003
  type: string
253
1004
  pattern: "^[A-Z]{2}$"
254
- virtual: { type: boolean }
255
-
256
- chair: { $ref: "#/$defs/Person" }
257
- secretary: { $ref: "#/$defs/Person" }
258
- 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"
259
1013
  hosts:
260
1014
  type: array
261
1015
  items:
262
- $ref: "#/$defs/HostRef"
263
-
1016
+ "$ref": "#/$defs/HostRef"
264
1017
  source_urls:
265
1018
  type: array
266
1019
  items:
267
- $ref: "#/$defs/SourceUrl"
268
- landing_url: { type: string }
269
- registration_url: { type: string }
270
-
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"
271
1031
  agenda:
272
- $ref: "#/$defs/Agenda"
273
- schedule:
1032
+ "$ref": "#/$defs/Agenda"
1033
+ components:
274
1034
  type: array
275
1035
  items:
276
- $ref: "#/$defs/ScheduleItem"
1036
+ "$ref": "#/$defs/MeetingComponent"
277
1037
  deadlines:
278
1038
  type: array
279
1039
  items:
280
- $ref: "#/$defs/Deadline"
281
-
282
- localizations:
1040
+ "$ref": "#/$defs/Deadline"
1041
+ attendance:
1042
+ type: array
1043
+ items:
1044
+ "$ref": "#/$defs/Attendance"
1045
+ minutes:
1046
+ type: array
1047
+ items:
1048
+ "$ref": "#/$defs/Minutes"
1049
+ declarations:
283
1050
  type: array
284
1051
  items:
285
- $ref: "#/$defs/MeetingLocalization"
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:
1062
+ type: array
1063
+ items:
1064
+ "$ref": "#/$defs/StructuredIdentifier"
286
1065
  relations:
287
1066
  type: array
288
1067
  items:
289
- $ref: "#/$defs/MeetingRelation"
290
- resolution_refs:
1068
+ "$ref": "#/$defs/MeetingRelation"
1069
+ extensions:
291
1070
  type: array
292
- items: { type: string }
293
-
1071
+ items:
1072
+ "$ref": "#/$defs/MeetingExtension"
294
1073
  MeetingCollectionMetadata:
295
1074
  type: object
296
- description: "Display-level metadata for a MeetingCollection."
1075
+ description: 'Display-level metadata for a MeetingCollection. 1.0: per-field Localized.'
297
1076
  additionalProperties: false
298
1077
  properties:
299
- title: { type: string }
300
- source: { type: string }
301
-
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
302
1102
  MeetingCollection:
303
1103
  type: object
304
- description: "Top-level wrapper for many Meetings in one file."
1104
+ description: Top-level wrapper for many Meetings in one file.
305
1105
  additionalProperties: false
306
- required: [meetings]
1106
+ required:
1107
+ - meetings
307
1108
  properties:
308
1109
  metadata:
309
- $ref: "#/$defs/MeetingCollectionMetadata"
1110
+ "$ref": "#/$defs/MeetingCollectionMetadata"
310
1111
  meetings:
311
1112
  type: array
312
1113
  items:
313
- $ref: "#/$defs/Meeting"
314
-
315
- # ====================================================================
316
- # Enums. Each value-list must equal the matching Edoxen::Enums::*
317
- # frozen array; spec/edoxen/schema_meeting_enum_sync_spec.rb enforces.
318
- # ====================================================================
319
-
1114
+ "$ref": "#/$defs/Meeting"
320
1115
  MeetingType:
321
1116
  type: string
322
- description: "Edoxen::Enums::MEETING_TYPE."
323
- enum: [plenary, working_group, task_group, ad_hoc, joint, conference_session]
324
-
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
325
1147
  MeetingStatus:
326
1148
  type: string
327
- description: "Edoxen::Enums::MEETING_STATUS."
328
- enum: [upcoming, completed, cancelled]
329
-
1149
+ description: Edoxen::Enums::MEETING_STATUS.
1150
+ enum:
1151
+ - upcoming
1152
+ - completed
1153
+ - cancelled
330
1154
  AgendaStatus:
331
1155
  type: string
332
- description: "Edoxen::Enums::AGENDA_STATUS."
333
- enum: [draft, final, amended, cancelled, superseded]
334
-
1156
+ description: Edoxen::Enums::AGENDA_STATUS.
1157
+ enum:
1158
+ - draft
1159
+ - final
1160
+ - amended
1161
+ - cancelled
1162
+ - superseded
335
1163
  AgendaItemKind:
336
1164
  type: string
337
- description: "Edoxen::Enums::AGENDA_ITEM_KIND."
338
- enum: [numbered, unnumbered, header, opening, closing]
339
-
1165
+ description: Edoxen::Enums::AGENDA_ITEM_KIND.
1166
+ enum:
1167
+ - numbered
1168
+ - unnumbered
1169
+ - header
1170
+ - opening
1171
+ - closing
1172
+ - aob
340
1173
  AgendaItemOutcome:
341
1174
  type: string
342
- description: "Edoxen::Enums::AGENDA_ITEM_OUTCOME."
343
- enum: [discussed, resolved, deferred, adopted, withdrawn]
344
-
1175
+ description: Edoxen::Enums::AGENDA_ITEM_OUTCOME.
1176
+ enum:
1177
+ - discussed
1178
+ - resolved
1179
+ - deferred
1180
+ - adopted
1181
+ - withdrawn
1182
+ - carried
1183
+ - negatived
345
1184
  HostType:
346
1185
  type: string
347
- description: "Edoxen::Enums::HOST_TYPE."
348
- enum: [national_body, liaison, associate, organizer]
349
-
1186
+ description: Edoxen::Enums::HOST_TYPE.
1187
+ enum:
1188
+ - national_body
1189
+ - liaison
1190
+ - associate
1191
+ - organizer
350
1192
  MeetingRelationType:
351
1193
  type: string
352
- description: "Edoxen::Enums::MEETING_RELATION_TYPE."
353
- enum: [continues_from, continues_to, joint_with, supersedes, superseded_by, rescheduled_from, rescheduled_to]
354
-
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
355
1211
  SourceUrlKind:
356
1212
  type: string
357
- description: "Edoxen::Enums::SOURCE_URL_KIND."
358
- enum: [agenda_pdf, minutes_pdf, resolutions_pdf, report_pdf, register_url, landing_page]
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
1221
+ ParticipationStatus:
1222
+ type: string
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
1247
+ VoteType:
1248
+ type: string
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"