edoxen 0.7.2 → 0.8.2

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