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/edoxen.yaml CHANGED
@@ -1,237 +1,261 @@
1
1
  ---
2
- $schema: "http://json-schema.org/draft-07/schema#"
3
- $id: "https://github.com/edoxen/edoxen/schema/edoxen.yaml"
4
- title: "Edoxen Resolution Collection Schema"
2
+ "$schema": http://json-schema.org/draft-07/schema#
3
+ "$id": https://github.com/edoxen/edoxen-model/schema/decision-collection.yaml
4
+ title: Edoxen Decision Collection Schema
5
5
  description: |
6
- Schema for validating Edoxen ResolutionCollection YAML files.
6
+ Schema for validating Edoxen decision-side YAML files.
7
+
8
+ Accepts three top-level document kinds via `oneOf`:
9
+
10
+ * `DecisionCollection` — the formal outcomes adopted by a Meeting.
11
+ * `ContactRegister` — a scoped-URN registry of Contacts.
12
+ * `VenueRegister` — a scoped-URN registry of Venues.
7
13
 
8
14
  Mirrors the canonical LutaML information model in
9
15
  https://github.com/edoxen/edoxen-model/tree/main/models .
10
16
 
11
- The enum constants declared under `$defs` (ActionType,
12
- ConsiderationType, ApprovalType, ApprovalDegree, ResolutionType,
13
- ResolutionDateType, ResolutionRelationType, UrlKind) are the
14
- authoritative wire values. `spec/edoxen/schema_enum_sync_spec.rb`
15
- asserts each one is character-for-character identical to the
16
- corresponding `Edoxen::Enums::*` frozen array.
17
+ The enum constants declared under `$defs` are the authoritative wire
18
+ values. `spec/edoxen/schema_enum_sync_spec.rb` asserts each one is
19
+ character-for-character identical to the corresponding `Edoxen::Enums::*`
20
+ frozen array.
17
21
 
18
22
  Trade-off: json_schemer's `valid_values` is not populated when an
19
23
  `enum` is reached via `$ref`, so the validator's enum-violation
20
24
  message degrades to "value ... is not one of: (see schema)". This
21
25
  is documented in `Edoxen::SchemaValidator#format_message`.
22
26
  type: object
23
- additionalProperties: false
24
-
25
- properties:
26
- metadata:
27
- $ref: "#/$defs/ResolutionMetadata"
28
- resolutions:
29
- type: array
30
- items:
31
- $ref: "#/$defs/Resolution"
32
-
33
- required:
34
- - resolutions
35
-
36
- $defs:
37
-
38
- # ====================================================================
39
- # Identifiers and references.
40
- # ====================================================================
41
-
27
+ oneOf:
28
+ - "$ref": "#/$defs/DecisionCollection"
29
+ - "$ref": "#/$defs/ContactRegister"
30
+ - "$ref": "#/$defs/VenueRegister"
31
+ - "$ref": "#/$defs/BodyRegister"
32
+ "$defs":
33
+ DecisionCollection:
34
+ type: object
35
+ description: |
36
+ Top-level container for a published decision collection: metadata
37
+ plus the list of decisions.
38
+ additionalProperties: false
39
+ properties:
40
+ metadata:
41
+ "$ref": "#/$defs/DecisionMetadata"
42
+ decisions:
43
+ type: array
44
+ items:
45
+ "$ref": "#/$defs/Decision"
46
+ required:
47
+ - decisions
42
48
  StructuredIdentifier:
43
49
  type: object
44
- description: "A resolution identifier (prefix + number). A Resolution may carry 1..* of these."
50
+ description: An identifier (prefix + number). A Decision carries 1..* of these.
45
51
  additionalProperties: false
46
- required: [prefix, number]
52
+ required:
53
+ - prefix
54
+ - number
47
55
  properties:
48
56
  prefix:
49
57
  type: string
50
- description: "Authority prefix, e.g. 'ISO', 'OIML', 'CIML'."
51
58
  number:
52
59
  type: string
53
- description: "Resolution number issued under that prefix."
54
-
60
+ EntityRef:
61
+ type: object
62
+ description: |
63
+ Typed cross-reference between entities (1.0, TODO.refactor/1.0-design).
64
+ Exactly one of `urn`, `identifier`, or `local_ref` should be set;
65
+ the gem's `EntityRef#valid?` enforces this in Ruby.
66
+ additionalProperties: false
67
+ properties:
68
+ urn:
69
+ type: string
70
+ identifier:
71
+ "$ref": "#/$defs/StructuredIdentifier"
72
+ local_ref:
73
+ type: string
74
+ kind:
75
+ type: string
76
+ role:
77
+ type: string
78
+ note:
79
+ type: string
55
80
  MeetingIdentifier:
56
81
  type: object
57
- description: "Identifies the meeting a Resolution belongs to."
82
+ description: Identifies the meeting a Decision belongs to.
58
83
  additionalProperties: false
59
84
  properties:
60
85
  venue:
61
86
  type: string
62
- description: "Meeting venue name (free text)."
63
87
  date:
64
88
  type: string
65
89
  format: date
66
- description: "Meeting date."
67
-
68
90
  Url:
69
91
  type: object
70
- description: "URL with a kind (access / report) and an optional format hint."
92
+ description: URL with a kind (access / report) and an optional format hint.
71
93
  additionalProperties: false
72
- required: [kind, ref]
94
+ required:
95
+ - kind
96
+ - ref
73
97
  properties:
74
98
  kind:
75
- $ref: "#/$defs/UrlKind"
99
+ "$ref": "#/$defs/UrlKind"
76
100
  ref:
77
101
  type: string
78
102
  format:
79
103
  type: string
80
-
81
- ResolutionRelation:
104
+ DecisionRelation:
82
105
  type: object
83
- description: "Directed relation between two resolutions identified by their StructuredIdentifier."
106
+ description: Directed relation between two decisions identified by their StructuredIdentifier.
84
107
  additionalProperties: false
85
- required: [source, destination, type]
108
+ required:
109
+ - source
110
+ - destination
111
+ - type
86
112
  properties:
87
113
  source:
88
- $ref: "#/$defs/StructuredIdentifier"
114
+ "$ref": "#/$defs/StructuredIdentifier"
89
115
  destination:
90
- $ref: "#/$defs/StructuredIdentifier"
116
+ "$ref": "#/$defs/StructuredIdentifier"
91
117
  type:
92
- $ref: "#/$defs/ResolutionRelationType"
93
-
94
- # ====================================================================
95
- # Date carriers.
96
- # ====================================================================
97
-
98
- ResolutionDate:
118
+ "$ref": "#/$defs/DecisionRelationType"
119
+ DecisionDate:
99
120
  type: object
100
- description: "Date with semantic kind (adoption / drafted / discussed)."
121
+ description: Date with semantic kind (adoption / drafted / discussed).
101
122
  additionalProperties: false
102
- required: [date, type]
123
+ required:
124
+ - date
125
+ - type
103
126
  properties:
104
127
  date:
105
128
  type: string
106
129
  format: date
107
- description: "The date itself."
108
130
  type:
109
- $ref: "#/$defs/ResolutionDateType"
110
-
111
- # ====================================================================
112
- # Per-localization sub-structures. Each is owned by exactly one
113
- # Language; the language_code discriminator lives on Localization.
114
- # ====================================================================
115
-
131
+ "$ref": "#/$defs/DecisionDateType"
116
132
  Action:
117
133
  type: object
118
- description: "A verb + one effective date + human-readable message."
134
+ description: A verb + one effective date + human-readable message.
119
135
  additionalProperties: false
120
- required: [type, message, date_effective]
136
+ required:
137
+ - type
138
+ - message
139
+ - date_effective
121
140
  properties:
122
141
  type:
123
- $ref: "#/$defs/ActionType"
142
+ "$ref": "#/$defs/ActionType"
124
143
  date_effective:
125
- $ref: "#/$defs/ResolutionDate"
144
+ "$ref": "#/$defs/DecisionDate"
126
145
  message:
127
- type: string
128
-
146
+ type: array
147
+ items:
148
+ "$ref": "#/$defs/LocalizedString"
129
149
  Approval:
130
150
  type: object
131
- description: "Approval record: vote type, consensus degree, date, message."
151
+ description: 'Approval record: vote type, consensus degree, date, message.'
132
152
  additionalProperties: false
133
- required: [type, degree, date]
153
+ required:
154
+ - type
155
+ - degree
156
+ - date
134
157
  properties:
135
158
  type:
136
- $ref: "#/$defs/ApprovalType"
159
+ "$ref": "#/$defs/ApprovalType"
137
160
  degree:
138
- $ref: "#/$defs/ApprovalDegree"
161
+ "$ref": "#/$defs/ApprovalDegree"
139
162
  date:
140
- $ref: "#/$defs/ResolutionDate"
163
+ "$ref": "#/$defs/DecisionDate"
141
164
  message:
142
- type: string
143
-
165
+ type: array
166
+ items:
167
+ "$ref": "#/$defs/LocalizedString"
144
168
  Consideration:
145
169
  type: object
146
- description: "The basis for a Resolution: a verb + one effective date + reasoning."
170
+ description: 'The basis for a Decision: a verb + one effective date + reasoning.'
147
171
  additionalProperties: false
148
- required: [type, message, date_effective]
172
+ required:
173
+ - type
174
+ - message
175
+ - date_effective
149
176
  properties:
150
177
  type:
151
- $ref: "#/$defs/ConsiderationType"
178
+ "$ref": "#/$defs/ConsiderationType"
152
179
  date_effective:
153
- $ref: "#/$defs/ResolutionDate"
180
+ "$ref": "#/$defs/DecisionDate"
154
181
  message:
155
- type: string
156
-
157
- Localization:
182
+ type: array
183
+ items:
184
+ "$ref": "#/$defs/LocalizedString"
185
+ LocalizedString:
158
186
  type: object
159
187
  description: |
160
- A monolingual rendering of a Resolution. Mirrors the glossarist
161
- LocalizedConcept pattern: language-agnostic fields live on the
162
- parent Resolution; per-language content lives here.
188
+ One language-specific value of a translatable String field.
189
+ `spelling` is an ISO 24229 spelling/conversion system code.
190
+ Always verbose — single-language data uses the same
191
+ `[{ spelling, value }]` shape as multi-language data.
163
192
  additionalProperties: false
164
- required: [language_code]
193
+ required:
194
+ - spelling
195
+ - value
165
196
  properties:
166
- language_code:
167
- type: string
168
- pattern: "^[a-z]{3}$"
169
- description: "ISO 639-3 three-letter language code (eng, fra, deu, spa, jpn, ...)."
170
- script:
171
- type: string
172
- pattern: "^[A-Z][a-z]{3}$"
173
- description: "ISO 15924 four-letter script code (Latn, Cyrl, Hant, Arab)."
174
- title:
175
- type: string
176
- subject:
177
- type: string
178
- message:
197
+ spelling:
179
198
  type: string
180
- considering:
199
+ value:
181
200
  type: string
182
- considerations:
183
- type: array
184
- items:
185
- $ref: "#/$defs/Consideration"
186
- approvals:
201
+ extensions:
187
202
  type: array
188
203
  items:
189
- $ref: "#/$defs/Approval"
190
- actions:
204
+ "$ref": "#/$defs/MeetingExtension"
205
+ LocalizedName:
206
+ type: object
207
+ description: |
208
+ One language-specific value of a translatable Name field.
209
+ Mirrors LocalizedString but carries a structured Name.
210
+ additionalProperties: false
211
+ required:
212
+ - spelling
213
+ - value
214
+ properties:
215
+ spelling:
216
+ type: string
217
+ value:
218
+ "$ref": "#/$defs/Name"
219
+ extensions:
191
220
  type: array
192
221
  items:
193
- $ref: "#/$defs/Action"
194
-
222
+ "$ref": "#/$defs/MeetingExtension"
195
223
  SourceUrl:
196
224
  type: object
197
- description: "Per-language canonical source URL (e.g. one PDF per language)."
225
+ description: Per-spelling canonical source URL (e.g. one PDF per language).
198
226
  additionalProperties: false
199
- required: [ref, format, language_code]
227
+ required:
228
+ - ref
200
229
  properties:
201
230
  ref:
202
231
  type: string
203
- description: "The URL string."
204
232
  format:
205
233
  type: string
206
- description: "Document format, e.g. 'pdf', 'html'."
207
- language_code:
234
+ spelling:
208
235
  type: string
209
- pattern: "^[a-z]{3}$"
236
+ description: ISO 24229 spelling/conversion system code
210
237
  kind:
211
- type: string
212
- description: "Optional discriminator (agenda_pdf, minutes_pdf, ...)."
213
- enum: [agenda_pdf, minutes_pdf, resolutions_pdf, report_pdf, register_url, landing_page]
214
-
215
- # ====================================================================
216
- # Top-level structures.
217
- # ====================================================================
218
-
219
- Resolution:
238
+ "$ref": "#/$defs/SourceUrlKind"
239
+ Decision:
220
240
  type: object
221
241
  description: |
222
- A formal Resolution. Language-agnostic admin fields live here;
223
- every translatable field is wrapped inside `localizations[]`
224
- (one entry per available language; at least one is required).
242
+ A formal Decision. 1.0: per-field Localized (every translatable
243
+ field carries its own spelling tag). Removed `localizations[]`.
225
244
  additionalProperties: false
226
- required: [identifier, localizations]
245
+ required:
246
+ - identifier
227
247
  properties:
228
248
  identifier:
229
249
  type: array
230
250
  minItems: 1
231
251
  items:
232
- $ref: "#/$defs/StructuredIdentifier"
233
- type:
234
- $ref: "#/$defs/ResolutionType"
252
+ "$ref": "#/$defs/StructuredIdentifier"
253
+ kind:
254
+ "$ref": "#/$defs/DecisionKind"
255
+ status:
256
+ "$ref": "#/$defs/DecisionStatus"
257
+ body_type:
258
+ type: string
235
259
  doi:
236
260
  type: string
237
261
  urn:
@@ -241,150 +265,1307 @@ $defs:
241
265
  dates:
242
266
  type: array
243
267
  items:
244
- $ref: "#/$defs/ResolutionDate"
268
+ "$ref": "#/$defs/DecisionDate"
245
269
  categories:
246
270
  type: array
247
271
  items:
248
272
  type: string
249
273
  meeting:
250
- $ref: "#/$defs/MeetingIdentifier"
274
+ "$ref": "#/$defs/MeetingIdentifier"
251
275
  relations:
252
276
  type: array
253
277
  items:
254
- $ref: "#/$defs/ResolutionRelation"
278
+ "$ref": "#/$defs/DecisionRelation"
255
279
  urls:
256
280
  type: array
257
281
  items:
258
- $ref: "#/$defs/Url"
259
- localizations:
282
+ "$ref": "#/$defs/Url"
283
+ brought_by_motions:
260
284
  type: array
261
- minItems: 1
262
285
  items:
263
- $ref: "#/$defs/Localization"
264
-
265
- ResolutionMetadata:
286
+ type: string
287
+ about_topics:
288
+ type: array
289
+ items:
290
+ type: string
291
+ made_in_component:
292
+ type: string
293
+ title:
294
+ type: array
295
+ items:
296
+ "$ref": "#/$defs/LocalizedString"
297
+ subject:
298
+ type: array
299
+ items:
300
+ "$ref": "#/$defs/LocalizedString"
301
+ message:
302
+ type: array
303
+ items:
304
+ "$ref": "#/$defs/LocalizedString"
305
+ considering:
306
+ type: array
307
+ items:
308
+ "$ref": "#/$defs/LocalizedString"
309
+ considerations:
310
+ type: array
311
+ items:
312
+ "$ref": "#/$defs/Consideration"
313
+ approvals:
314
+ type: array
315
+ items:
316
+ "$ref": "#/$defs/Approval"
317
+ actions:
318
+ type: array
319
+ items:
320
+ "$ref": "#/$defs/Action"
321
+ extensions:
322
+ type: array
323
+ items:
324
+ "$ref": "#/$defs/MeetingExtension"
325
+ DecisionMetadata:
266
326
  type: object
267
- description: "Collection-level metadata (title, meeting date, source, source URLs, host venue)."
327
+ description: Collection-level metadata (localized title, meeting date, source, source URLs, host venue).
268
328
  additionalProperties: false
269
329
  properties:
270
330
  title:
271
- type: string
272
- description: "Default title (no language). For multilingual, use `title_localized[]`."
273
- title_localized:
274
331
  type: array
275
332
  items:
276
- $ref: "#/$defs/Localization"
277
- description: "Per-language title records (parallel pattern to Resolution#localizations)."
333
+ "$ref": "#/$defs/LocalizedString"
278
334
  date:
279
335
  type: string
280
336
  format: date
281
- description: "Meeting date."
282
337
  source:
283
338
  type: string
284
- description: "Source organization / secretariat that issued the collection."
285
339
  source_urls:
286
340
  type: array
287
341
  items:
288
- $ref: "#/$defs/SourceUrl"
289
- description: "Canonical URLs to the source PDFs in each available language."
342
+ "$ref": "#/$defs/SourceUrl"
290
343
  city:
291
344
  type: string
292
345
  pattern: "^[A-Z]{2}[A-Z0-9]{3}$"
293
- description: "UN/LOCODE of the host city (5-char: 2-letter ISO 3166-1 country + 3-char location, e.g. FRPAR, CNSHA, HKHKG). Supersedes the IATA city code."
294
346
  country_code:
295
347
  type: string
296
- description: "ISO 3166-1 alpha-2 country code (2-letter, e.g. DE, FR, JP) of the host country."
348
+ pattern: "^[A-Z]{2}$"
297
349
  meeting_urn:
298
350
  type: string
299
- description: "URN back-reference to the Meeting that produced this collection."
300
-
301
- # ====================================================================
302
- # Enums. Each is referenced by its $ref name above. The schema
303
- # <-> Ruby enum sync spec asserts each value-list matches the
304
- # corresponding Edoxen::Enums::* frozen array.
305
- # ====================================================================
306
-
307
- ActionType:
308
- type: string
309
- description: "Edoxen::Enums::ACTION_TYPE — LUTAML action.lutaml (deduped)."
310
- enum:
311
- - adopts
312
- - thanks
313
- - approves
314
- - decides
315
- - declares
316
- - asks
317
- - invites
318
- - resolves
319
- - confirms
320
- - welcomes
321
- - recommends
322
- - requests
323
- - congratulates
324
- - instructs
325
- - urges
326
- - appoints
327
- - calls-upon
328
- - encourages
329
- - affirms
330
- - elects
331
- - authorizes
332
- - charges
333
- - states
334
- - remarks
335
- - judges
336
- - sanctions
337
- - abrogates
338
- - empowers
339
-
340
- ConsiderationType:
341
- type: string
342
- description: "Edoxen::Enums::CONSIDERATION_TYPE — LUTAML consideration.lutaml (deduped)."
343
- enum:
344
- - having
345
- - noting
346
- - recognizing
347
- - acknowledging
348
- - recalling
349
- - reaffirming
350
- - considering
351
- - taking-into-account
352
- - pursuant-to
353
- - bearing-in-mind
354
- - emphasizing
355
- - concerned
356
- - accepts
357
- - observing
358
- - referring
359
- - acting
360
- - empowers
361
-
362
- ApprovalType:
363
- type: string
364
- description: "Edoxen::Enums::APPROVAL_TYPE — LUTAML approval_type.lutaml."
365
- enum: [affirmative, negative]
366
-
367
- ApprovalDegree:
368
- type: string
369
- description: "Edoxen::Enums::APPROVAL_DEGREE — LUTAML approval_degree.lutaml."
370
- enum: [unanimous, majority, minority]
371
-
372
- ResolutionType:
373
- type: string
374
- description: "Edoxen::Enums::RESOLUTION_TYPE LUTAML resolution_type.lutaml."
375
- enum: [resolution, recommendation, decision, declaration]
376
-
377
- ResolutionDateType:
378
- type: string
379
- description: "Edoxen::Enums::RESOLUTION_DATE_TYPE — LUTAML resolution_date_type.lutaml."
380
- enum: [adoption, drafted, discussed]
381
-
382
- ResolutionRelationType:
383
- type: string
384
- description: "Edoxen::Enums::RESOLUTION_RELATION_TYPE — LUTAML resolution_relation_type.lutaml."
385
- enum: [annexOf, hasAnnex, updates, refines, replaces, considers]
386
-
387
- UrlKind:
388
- type: string
389
- description: "Edoxen::Enums::URL_KIND."
390
- enum: [access, report]
351
+ body_vocabulary:
352
+ type: array
353
+ items:
354
+ "$ref": "#/$defs/BodyVocabularyEntry"
355
+ extensions:
356
+ type: array
357
+ items:
358
+ "$ref": "#/$defs/MeetingExtension"
359
+ BodyVocabularyEntry:
360
+ type: object
361
+ description: |
362
+ One entry in a per-dataset body_vocabulary list. Maps a free-form
363
+ body_type to a short canonical value. SSOT for body_type ->
364
+ canonical_type resolution within the declaring collection.
365
+ additionalProperties: false
366
+ properties:
367
+ body_type:
368
+ type: string
369
+ canonical_type:
370
+ type: string
371
+ definition:
372
+ type: string
373
+ Motion:
374
+ type: object
375
+ description: A procedural act that brings a Decision.
376
+ additionalProperties: false
377
+ properties:
378
+ identifier:
379
+ type: string
380
+ urn:
381
+ type: string
382
+ text:
383
+ type: array
384
+ items:
385
+ "$ref": "#/$defs/LocalizedString"
386
+ mover:
387
+ "$ref": "#/$defs/Person"
388
+ seconders:
389
+ type: array
390
+ items:
391
+ "$ref": "#/$defs/Person"
392
+ status:
393
+ "$ref": "#/$defs/MotionStatus"
394
+ introduced_at:
395
+ type: string
396
+ format: date-time
397
+ proposed_decision:
398
+ type: string
399
+ resulting_decision:
400
+ type: string
401
+ resulting_decision_ref:
402
+ "$ref": "#/$defs/EntityRef"
403
+ votings:
404
+ type: array
405
+ items:
406
+ type: string
407
+ extensions:
408
+ type: array
409
+ items:
410
+ "$ref": "#/$defs/MeetingExtension"
411
+ VotingCounts:
412
+ type: object
413
+ description: Tally for a Voting instance.
414
+ additionalProperties: false
415
+ properties:
416
+ ayes:
417
+ type: integer
418
+ noes:
419
+ type: integer
420
+ abstentions:
421
+ type: integer
422
+ absent:
423
+ type: integer
424
+ Voting:
425
+ type: object
426
+ description: State machine for a single vote on a Motion.
427
+ additionalProperties: false
428
+ properties:
429
+ identifier:
430
+ type: string
431
+ urn:
432
+ type: string
433
+ on_motion:
434
+ type: string
435
+ status:
436
+ "$ref": "#/$defs/VotingStatus"
437
+ voting_method:
438
+ "$ref": "#/$defs/VotingMethod"
439
+ called_by:
440
+ "$ref": "#/$defs/Person"
441
+ called_at:
442
+ type: string
443
+ format: date-time
444
+ result_declared_at:
445
+ type: string
446
+ format: date-time
447
+ result:
448
+ "$ref": "#/$defs/VotingOutcome"
449
+ counts:
450
+ "$ref": "#/$defs/VotingCounts"
451
+ casting_vote:
452
+ "$ref": "#/$defs/VoteRecord"
453
+ vote_records:
454
+ type: array
455
+ items:
456
+ "$ref": "#/$defs/VoteRecord"
457
+ extensions:
458
+ type: array
459
+ items:
460
+ "$ref": "#/$defs/MeetingExtension"
461
+ TopicDocument:
462
+ type: object
463
+ description: 'Text-bearing document about a Topic. 1.0: per-field Localized.'
464
+ additionalProperties: false
465
+ properties:
466
+ identifier:
467
+ type: string
468
+ title:
469
+ type: array
470
+ items:
471
+ "$ref": "#/$defs/LocalizedString"
472
+ version:
473
+ type: string
474
+ status:
475
+ type: string
476
+ url:
477
+ type: string
478
+ format:
479
+ type: string
480
+ spelling:
481
+ type: string
482
+ description: ISO 24229 spelling/conversion system code
483
+ extensions:
484
+ type: array
485
+ items:
486
+ "$ref": "#/$defs/MeetingExtension"
487
+ TopicAsset:
488
+ type: object
489
+ description: 'Non-text resource about a Topic. 1.0: per-field Localized.'
490
+ additionalProperties: false
491
+ properties:
492
+ identifier:
493
+ type: string
494
+ title:
495
+ type: array
496
+ items:
497
+ "$ref": "#/$defs/LocalizedString"
498
+ kind:
499
+ type: string
500
+ url:
501
+ type: string
502
+ format:
503
+ type: string
504
+ extensions:
505
+ type: array
506
+ items:
507
+ "$ref": "#/$defs/MeetingExtension"
508
+ Topic:
509
+ type: object
510
+ description: 'The subject of discussion at a Meeting. 1.0: per-field Localized.'
511
+ additionalProperties: false
512
+ properties:
513
+ identifier:
514
+ type: string
515
+ urn:
516
+ type: string
517
+ title:
518
+ type: array
519
+ items:
520
+ "$ref": "#/$defs/LocalizedString"
521
+ description:
522
+ type: array
523
+ items:
524
+ "$ref": "#/$defs/LocalizedString"
525
+ status:
526
+ "$ref": "#/$defs/TopicStatus"
527
+ resumption_of:
528
+ type: string
529
+ documents:
530
+ type: array
531
+ items:
532
+ "$ref": "#/$defs/TopicDocument"
533
+ assets:
534
+ type: array
535
+ items:
536
+ "$ref": "#/$defs/TopicAsset"
537
+ references:
538
+ type: array
539
+ items:
540
+ "$ref": "#/$defs/Reference"
541
+ motions:
542
+ type: array
543
+ items:
544
+ type: string
545
+ decisions:
546
+ type: array
547
+ items:
548
+ type: string
549
+ statements:
550
+ type: array
551
+ items:
552
+ "$ref": "#/$defs/Statement"
553
+ declarations:
554
+ type: array
555
+ items:
556
+ "$ref": "#/$defs/Declaration"
557
+ extensions:
558
+ type: array
559
+ items:
560
+ "$ref": "#/$defs/MeetingExtension"
561
+ Venue:
562
+ type: object
563
+ description: |
564
+ Polymorphic place where a Meeting happens. `kind` discriminates
565
+ physical vs virtual; all fields from both subtypes live here as
566
+ optional siblings. 1.0: per-field Localized (name, label,
567
+ description, address, building, floor, room, access_notes).
568
+ Added `urn` (registry identity) and `ref` (reference-by-URN).
569
+ additionalProperties: false
570
+ properties:
571
+ ref:
572
+ type: string
573
+ local_ref:
574
+ type: string
575
+ urn:
576
+ type: string
577
+ pattern: "^urn:edoxen:venue:[^:]+:[^:]+$"
578
+ kind:
579
+ "$ref": "#/$defs/VenueKind"
580
+ name:
581
+ type: array
582
+ items:
583
+ "$ref": "#/$defs/LocalizedString"
584
+ label:
585
+ type: array
586
+ items:
587
+ "$ref": "#/$defs/LocalizedString"
588
+ description:
589
+ type: array
590
+ items:
591
+ "$ref": "#/$defs/LocalizedString"
592
+ capacity:
593
+ type: integer
594
+ url:
595
+ type: string
596
+ contact_methods:
597
+ type: array
598
+ items:
599
+ "$ref": "#/$defs/ContactMethod"
600
+ unlocode:
601
+ type: string
602
+ pattern: "^[A-Z]{2}[A-Z0-9]{3}$"
603
+ iata_code:
604
+ type: string
605
+ pattern: "^[A-Z]{3}$"
606
+ address:
607
+ type: array
608
+ items:
609
+ "$ref": "#/$defs/LocalizedString"
610
+ city:
611
+ type: string
612
+ country_code:
613
+ type: string
614
+ pattern: "^[A-Z]{2}$"
615
+ lat:
616
+ type: number
617
+ lon:
618
+ type: number
619
+ building:
620
+ type: array
621
+ items:
622
+ "$ref": "#/$defs/LocalizedString"
623
+ floor:
624
+ type: array
625
+ items:
626
+ "$ref": "#/$defs/LocalizedString"
627
+ room:
628
+ type: array
629
+ items:
630
+ "$ref": "#/$defs/LocalizedString"
631
+ access_notes:
632
+ type: array
633
+ items:
634
+ "$ref": "#/$defs/LocalizedString"
635
+ uri:
636
+ type: string
637
+ features:
638
+ type: array
639
+ items:
640
+ "$ref": "#/$defs/VirtualFeature"
641
+ passcode:
642
+ type: string
643
+ meeting_id:
644
+ type: string
645
+ dial_in_numbers:
646
+ type: array
647
+ items:
648
+ type: string
649
+ waiting_room:
650
+ type: boolean
651
+ registration_required:
652
+ type: boolean
653
+ extensions:
654
+ type: array
655
+ items:
656
+ "$ref": "#/$defs/MeetingExtension"
657
+ PhysicalVenue:
658
+ description: Marker — Venue with kind=physical. Wire shape is identical to Venue.
659
+ allOf:
660
+ - "$ref": "#/$defs/Venue"
661
+ VirtualVenue:
662
+ description: Marker — Venue with kind=virtual. Wire shape is identical to Venue.
663
+ allOf:
664
+ - "$ref": "#/$defs/Venue"
665
+ RecurrenceByDay:
666
+ type: object
667
+ description: BYDAY part of a recurrence. `ordinal` is null for 'every', +1 for first, -1 for last.
668
+ additionalProperties: false
669
+ properties:
670
+ ordinal:
671
+ type: integer
672
+ weekday:
673
+ type: string
674
+ Recurrence:
675
+ type: object
676
+ description: Structured ISO 8601-2 §13 recurrence.
677
+ additionalProperties: false
678
+ properties:
679
+ freq:
680
+ "$ref": "#/$defs/RecurrenceFreq"
681
+ interval:
682
+ type: integer
683
+ count:
684
+ type: integer
685
+ until:
686
+ type: string
687
+ format: date-time
688
+ by_day:
689
+ type: array
690
+ items:
691
+ "$ref": "#/$defs/RecurrenceByDay"
692
+ by_month_day:
693
+ type: array
694
+ items:
695
+ type: integer
696
+ by_month:
697
+ type: array
698
+ items:
699
+ type: integer
700
+ by_week_no:
701
+ type: array
702
+ items:
703
+ type: integer
704
+ by_year_day:
705
+ type: array
706
+ items:
707
+ type: integer
708
+ by_hour:
709
+ type: array
710
+ items:
711
+ type: integer
712
+ by_minute:
713
+ type: array
714
+ items:
715
+ type: integer
716
+ by_second:
717
+ type: array
718
+ items:
719
+ type: integer
720
+ by_set_pos:
721
+ type: array
722
+ items:
723
+ type: integer
724
+ week_start:
725
+ type: string
726
+ extensions:
727
+ type: array
728
+ items:
729
+ "$ref": "#/$defs/MeetingExtension"
730
+ ExtensionAttribute:
731
+ type: object
732
+ description: |
733
+ One typed key/value pair within a MeetingExtension. Polymorphic on
734
+ value type so consumers don't re-parse strings back into Int/Float/
735
+ Bool/Date (1.0 tighten, TODO.refactor/1.0-design).
736
+ additionalProperties: false
737
+ properties:
738
+ key:
739
+ type: string
740
+ type:
741
+ type: string
742
+ enum:
743
+ - string
744
+ - integer
745
+ - float
746
+ - boolean
747
+ - date
748
+ - datetime
749
+ value:
750
+ type: string
751
+ intValue:
752
+ type: integer
753
+ floatValue:
754
+ type: number
755
+ booleanValue:
756
+ type: boolean
757
+ dateValue:
758
+ type: string
759
+ format: date
760
+ dateTimeValue:
761
+ type: string
762
+ format: date-time
763
+ MeetingExtension:
764
+ type: object
765
+ description: |
766
+ Profile-specific extension. Adopters register their namespace via
767
+ `profile` and discriminate via `kind`. Field semantics tightened
768
+ 1.0 (TODO.refactor/1.0-design): `kind` is the in-profile discriminator,
769
+ `ref` is the URN of an external profile document, and the
770
+ recursive `extensions[]` slot was removed (YAGNI — use dotted
771
+ keys in `attributes[]` for nesting).
772
+ additionalProperties: false
773
+ properties:
774
+ profile:
775
+ type: string
776
+ kind:
777
+ type: string
778
+ ref:
779
+ type: string
780
+ attributes:
781
+ type: array
782
+ items:
783
+ "$ref": "#/$defs/ExtensionAttribute"
784
+ ContactMethodKind:
785
+ type: string
786
+ description: Polymorphic communication channel kind.
787
+ enum:
788
+ - phone
789
+ - mobile
790
+ - fax
791
+ - email
792
+ - url
793
+ - mail
794
+ - pager
795
+ - message
796
+ - other
797
+ ContactMethod:
798
+ type: object
799
+ description: |
800
+ One polymorphic communication channel — phone, email, fax, url,
801
+ mail, etc. `kind` discriminates the channel; `value` carries the
802
+ address/number; `label` is a free-form display hint ("Office",
803
+ "Front desk"). OCP: new channel kinds are added via the
804
+ ContactMethodKind enum (or `other` + extensions).
805
+ additionalProperties: false
806
+ properties:
807
+ kind:
808
+ "$ref": "#/$defs/ContactMethodKind"
809
+ value:
810
+ type: string
811
+ label:
812
+ type: string
813
+ primary:
814
+ type: boolean
815
+ extensions:
816
+ type: array
817
+ items:
818
+ "$ref": "#/$defs/MeetingExtension"
819
+ ContactIdentifierKind:
820
+ type: string
821
+ description: Polymorphic external identifier scheme for a Contact.
822
+ enum:
823
+ - orcid
824
+ - isni
825
+ - wikidata
826
+ - ror
827
+ - ringgold
828
+ - github
829
+ - other
830
+ ContactIdentifier:
831
+ type: object
832
+ description: |
833
+ One polymorphic external identifier — ORCID, ISNI, Wikidata QID,
834
+ ROR, Ringgold, GitHub handle, etc. Replaces the hard-coded `orcid`
835
+ field. OCP: new identifier schemes are added via the
836
+ ContactIdentifierKind enum (or `other` + extensions).
837
+ additionalProperties: false
838
+ properties:
839
+ kind:
840
+ "$ref": "#/$defs/ContactIdentifierKind"
841
+ value:
842
+ type: string
843
+ extensions:
844
+ type: array
845
+ items:
846
+ "$ref": "#/$defs/MeetingExtension"
847
+ Name:
848
+ type: object
849
+ description: |
850
+ Structured personal/organisational name (VCARD RFC 6350
851
+ conventions). `formatted` is the pre-built display string (FN);
852
+ the structured components (N) are stored separately for sorting,
853
+ indexing, or locale-aware rendering.
854
+ additionalProperties: false
855
+ properties:
856
+ formatted:
857
+ type: string
858
+ family:
859
+ type: string
860
+ given:
861
+ type: string
862
+ additional:
863
+ type: string
864
+ prefix:
865
+ type: string
866
+ suffix:
867
+ type: string
868
+ extensions:
869
+ type: array
870
+ items:
871
+ "$ref": "#/$defs/MeetingExtension"
872
+ Contact:
873
+ type: object
874
+ description: |
875
+ VCARD-like abstract contact. 1.0: per-field Localized
876
+ (name, title, affiliation, address). Added `urn` (registry
877
+ identity) and `ref` (reference-by-URN).
878
+ additionalProperties: false
879
+ properties:
880
+ ref:
881
+ type: string
882
+ local_ref:
883
+ type: string
884
+ urn:
885
+ type: string
886
+ pattern: "^urn:edoxen:contact:[^:]+:[^:]+$"
887
+ name:
888
+ type: array
889
+ items:
890
+ "$ref": "#/$defs/LocalizedName"
891
+ kind:
892
+ type: string
893
+ role:
894
+ type: string
895
+ title:
896
+ type: array
897
+ items:
898
+ "$ref": "#/$defs/LocalizedString"
899
+ affiliation:
900
+ type: array
901
+ items:
902
+ "$ref": "#/$defs/LocalizedString"
903
+ contact_methods:
904
+ type: array
905
+ items:
906
+ "$ref": "#/$defs/ContactMethod"
907
+ identifiers:
908
+ type: array
909
+ items:
910
+ "$ref": "#/$defs/ContactIdentifier"
911
+ address:
912
+ type: array
913
+ items:
914
+ "$ref": "#/$defs/LocalizedString"
915
+ extensions:
916
+ type: array
917
+ items:
918
+ "$ref": "#/$defs/MeetingExtension"
919
+ Person:
920
+ type: object
921
+ description: |
922
+ A Contact that is specifically an individual human. Schema
923
+ duplicates Contact's properties because JSON-Schema draft-07
924
+ doesn't support `extends`. Same shape; semantically a subclass.
925
+ additionalProperties: false
926
+ properties:
927
+ ref:
928
+ type: string
929
+ local_ref:
930
+ type: string
931
+ urn:
932
+ type: string
933
+ pattern: "^urn:edoxen:contact:[^:]+:[^:]+$"
934
+ name:
935
+ type: array
936
+ items:
937
+ "$ref": "#/$defs/LocalizedName"
938
+ kind:
939
+ type: string
940
+ role:
941
+ type: string
942
+ title:
943
+ type: array
944
+ items:
945
+ "$ref": "#/$defs/LocalizedString"
946
+ affiliation:
947
+ type: array
948
+ items:
949
+ "$ref": "#/$defs/LocalizedString"
950
+ contact_methods:
951
+ type: array
952
+ items:
953
+ "$ref": "#/$defs/ContactMethod"
954
+ identifiers:
955
+ type: array
956
+ items:
957
+ "$ref": "#/$defs/ContactIdentifier"
958
+ address:
959
+ type: array
960
+ items:
961
+ "$ref": "#/$defs/LocalizedString"
962
+ extensions:
963
+ type: array
964
+ items:
965
+ "$ref": "#/$defs/MeetingExtension"
966
+ Reference:
967
+ type: object
968
+ description: Generic document reference.
969
+ additionalProperties: false
970
+ properties:
971
+ ref:
972
+ type: string
973
+ kind:
974
+ type: string
975
+ title:
976
+ type: array
977
+ items:
978
+ "$ref": "#/$defs/LocalizedString"
979
+ VoteRecord:
980
+ type: object
981
+ description: One vote by one person on one decision/voting.
982
+ additionalProperties: false
983
+ required:
984
+ - person
985
+ - vote
986
+ properties:
987
+ decision_ref:
988
+ type: string
989
+ voting_ref:
990
+ type: string
991
+ person:
992
+ "$ref": "#/$defs/Person"
993
+ affiliation:
994
+ type: string
995
+ vote:
996
+ "$ref": "#/$defs/VoteType"
997
+ role:
998
+ type: string
999
+ notes:
1000
+ type: string
1001
+ extensions:
1002
+ type: array
1003
+ items:
1004
+ "$ref": "#/$defs/MeetingExtension"
1005
+ Officer:
1006
+ type: object
1007
+ description: A person holding a structural role in a Meeting.
1008
+ additionalProperties: false
1009
+ properties:
1010
+ role:
1011
+ "$ref": "#/$defs/OfficerRole"
1012
+ person:
1013
+ "$ref": "#/$defs/Person"
1014
+ term_start:
1015
+ type: string
1016
+ format: date
1017
+ term_end:
1018
+ type: string
1019
+ format: date
1020
+ extensions:
1021
+ type: array
1022
+ items:
1023
+ "$ref": "#/$defs/MeetingExtension"
1024
+ MeetingComponent:
1025
+ type: object
1026
+ description: 'Flat sub-event of a Meeting. 1.0: per-field Localized.'
1027
+ additionalProperties: false
1028
+ properties:
1029
+ identifier:
1030
+ type: string
1031
+ urn:
1032
+ type: string
1033
+ kind:
1034
+ "$ref": "#/$defs/ComponentKind"
1035
+ body_type:
1036
+ type: string
1037
+ title:
1038
+ type: array
1039
+ items:
1040
+ "$ref": "#/$defs/LocalizedString"
1041
+ description:
1042
+ type: array
1043
+ items:
1044
+ "$ref": "#/$defs/LocalizedString"
1045
+ starts_at:
1046
+ type: string
1047
+ format: date-time
1048
+ ends_at:
1049
+ type: string
1050
+ format: date-time
1051
+ time_label:
1052
+ type: array
1053
+ items:
1054
+ "$ref": "#/$defs/LocalizedString"
1055
+ venue_refs:
1056
+ type: array
1057
+ items:
1058
+ type: string
1059
+ officers:
1060
+ type: array
1061
+ items:
1062
+ "$ref": "#/$defs/Officer"
1063
+ agenda_ref:
1064
+ type: string
1065
+ minutes_ref:
1066
+ type: string
1067
+ attendance_refs:
1068
+ type: array
1069
+ items:
1070
+ type: string
1071
+ extensions:
1072
+ type: array
1073
+ items:
1074
+ "$ref": "#/$defs/MeetingExtension"
1075
+ MeetingSeries:
1076
+ type: object
1077
+ description: 'Parent of recurring Meeting instances. 1.0: per-field Localized.'
1078
+ additionalProperties: false
1079
+ properties:
1080
+ identifier:
1081
+ type: array
1082
+ items:
1083
+ "$ref": "#/$defs/StructuredIdentifier"
1084
+ urn:
1085
+ type: string
1086
+ name:
1087
+ type: array
1088
+ items:
1089
+ "$ref": "#/$defs/LocalizedString"
1090
+ description:
1091
+ type: array
1092
+ items:
1093
+ "$ref": "#/$defs/LocalizedString"
1094
+ recurrence:
1095
+ "$ref": "#/$defs/Recurrence"
1096
+ term:
1097
+ type: string
1098
+ contact:
1099
+ "$ref": "#/$defs/Contact"
1100
+ hosts:
1101
+ type: array
1102
+ items:
1103
+ "$ref": "#/$defs/HostRef"
1104
+ kind:
1105
+ type: string
1106
+ meeting_refs:
1107
+ type: array
1108
+ items:
1109
+ type: string
1110
+ extensions:
1111
+ type: array
1112
+ items:
1113
+ "$ref": "#/$defs/MeetingExtension"
1114
+ body_type:
1115
+ type: string
1116
+ HostRef:
1117
+ type: object
1118
+ description: Typed reference to a hosting organization.
1119
+ additionalProperties: false
1120
+ required:
1121
+ - ref
1122
+ properties:
1123
+ ref:
1124
+ type: string
1125
+ type:
1126
+ "$ref": "#/$defs/HostType"
1127
+ role:
1128
+ type: string
1129
+ contact:
1130
+ "$ref": "#/$defs/Contact"
1131
+ ContactRegister:
1132
+ type: object
1133
+ description: |
1134
+ Registry of Contacts indexed by scoped URN. Members carry
1135
+ `urn: urn:edoxen:contact:{scope}:{local-id}`; the collection's
1136
+ `scope` MUST match the scope segment in member URNs.
1137
+ additionalProperties: false
1138
+ properties:
1139
+ scope:
1140
+ type: string
1141
+ title:
1142
+ type: array
1143
+ items:
1144
+ "$ref": "#/$defs/LocalizedString"
1145
+ contacts:
1146
+ type: array
1147
+ items:
1148
+ "$ref": "#/$defs/Contact"
1149
+ extensions:
1150
+ type: array
1151
+ items:
1152
+ "$ref": "#/$defs/MeetingExtension"
1153
+ VenueRegister:
1154
+ type: object
1155
+ description: 'Registry of Venues indexed by scoped URN. Mirrors ContactRegister.
1156
+
1157
+ '
1158
+ additionalProperties: false
1159
+ properties:
1160
+ scope:
1161
+ type: string
1162
+ title:
1163
+ type: array
1164
+ items:
1165
+ "$ref": "#/$defs/LocalizedString"
1166
+ venues:
1167
+ type: array
1168
+ items:
1169
+ "$ref": "#/$defs/Venue"
1170
+ extensions:
1171
+ type: array
1172
+ items:
1173
+ "$ref": "#/$defs/MeetingExtension"
1174
+ ActionType:
1175
+ type: string
1176
+ description: |
1177
+ Action verb. Edoxen::Enums::ACTION_TYPE lists the canonical set
1178
+ (28 values). The schema is permissive — adopters may use
1179
+ body-specific verbs (e.g. "scopes", "directs", "establishes")
1180
+ outside the canonical set. The canonical set is advisory; the
1181
+ body_vocabulary mechanism (1.0, TODO.refactor/1.0-design) will
1182
+ eventually map body-specific verbs to canonical types.
1183
+ ConsiderationType:
1184
+ type: string
1185
+ description: |
1186
+ Consideration verb. Edoxen::Enums::CONSIDERATION_TYPE lists the
1187
+ canonical set. The schema is permissive — adopters may use
1188
+ body-specific verbs outside the canonical set (same rationale as
1189
+ ActionType).
1190
+ ApprovalType:
1191
+ type: string
1192
+ description: Edoxen::Enums::APPROVAL_TYPE.
1193
+ enum:
1194
+ - affirmative
1195
+ - negative
1196
+ ApprovalDegree:
1197
+ type: string
1198
+ description: Edoxen::Enums::APPROVAL_DEGREE.
1199
+ enum:
1200
+ - unanimous
1201
+ - majority
1202
+ - minority
1203
+ DecisionKind:
1204
+ type: string
1205
+ description: Edoxen::Enums::DECISION_KIND.
1206
+ enum:
1207
+ - resolution
1208
+ - order
1209
+ - ruling
1210
+ - determination
1211
+ - recommendation
1212
+ - statement
1213
+ - finding
1214
+ - opinion
1215
+ - other
1216
+ DecisionKindCanonical:
1217
+ type: string
1218
+ description: |
1219
+ Edoxen::Enums::DECISION_KIND_CANONICAL — short abstract set (1.0,
1220
+ TODO.refactor/1.0-design). Bodies extend via `body_type` + per-dataset
1221
+ `body_vocabulary[]`.
1222
+ enum:
1223
+ - decision
1224
+ - recommendation
1225
+ - statement
1226
+ - finding
1227
+ - other
1228
+ DecisionStatus:
1229
+ type: string
1230
+ description: Edoxen::Enums::DECISION_STATUS.
1231
+ enum:
1232
+ - draft
1233
+ - proposed
1234
+ - under_consideration
1235
+ - decided
1236
+ - negatived
1237
+ - withdrawn
1238
+ - deferred
1239
+ DecisionDateType:
1240
+ type: string
1241
+ description: Edoxen::Enums::DECISION_DATE_TYPE.
1242
+ enum:
1243
+ - adoption
1244
+ - drafted
1245
+ - discussed
1246
+ - proposed
1247
+ - decided
1248
+ - negatived
1249
+ - withdrawn
1250
+ - published
1251
+ - effective
1252
+ DecisionRelationType:
1253
+ type: string
1254
+ description: Edoxen::Enums::DECISION_RELATION_TYPE.
1255
+ enum:
1256
+ - annex_of
1257
+ - has_annex
1258
+ - updates
1259
+ - refines
1260
+ - replaces
1261
+ - considers
1262
+ - cites
1263
+ MotionStatus:
1264
+ type: string
1265
+ description: Edoxen::Enums::MOTION_STATUS.
1266
+ enum:
1267
+ - introduced
1268
+ - seconded
1269
+ - debating
1270
+ - question_put
1271
+ - voting
1272
+ - carried
1273
+ - negatived
1274
+ - withdrawn
1275
+ - lapsed
1276
+ VotingStatus:
1277
+ type: string
1278
+ description: Edoxen::Enums::VOTING_STATUS.
1279
+ enum:
1280
+ - called
1281
+ - in_progress
1282
+ - decided
1283
+ - withdrawn
1284
+ - deferred
1285
+ VotingMethod:
1286
+ type: string
1287
+ description: Edoxen::Enums::VOTING_METHOD.
1288
+ enum:
1289
+ - voice
1290
+ - division
1291
+ - show_of_hands
1292
+ - roll_call
1293
+ - electronic
1294
+ - secret_ballot
1295
+ - unanimous_consent
1296
+ - consensus
1297
+ VotingOutcome:
1298
+ type: string
1299
+ description: Edoxen::Enums::VOTING_OUTCOME.
1300
+ enum:
1301
+ - passed
1302
+ - negatived
1303
+ - tied
1304
+ - withdrawn
1305
+ TopicStatus:
1306
+ type: string
1307
+ description: Edoxen::Enums::TOPIC_STATUS.
1308
+ enum:
1309
+ - open
1310
+ - under_discussion
1311
+ - decided
1312
+ - deferred
1313
+ - withdrawn
1314
+ VenueKind:
1315
+ type: string
1316
+ description: Edoxen::Enums::VENUE_KIND.
1317
+ enum:
1318
+ - physical
1319
+ - virtual
1320
+ VirtualFeature:
1321
+ type: string
1322
+ description: Edoxen::Enums::VIRTUAL_FEATURE.
1323
+ enum:
1324
+ - audio
1325
+ - video
1326
+ - chat
1327
+ - phone
1328
+ - screen
1329
+ - feed
1330
+ Visibility:
1331
+ type: string
1332
+ description: Edoxen::Enums::VISIBILITY.
1333
+ enum:
1334
+ - public
1335
+ - private
1336
+ - confidential
1337
+ AttendanceRole:
1338
+ type: string
1339
+ description: Edoxen::Enums::ATTENDANCE_ROLE.
1340
+ enum:
1341
+ - chair
1342
+ - required
1343
+ - optional
1344
+ - non_participant
1345
+ AttendanceResponse:
1346
+ type: string
1347
+ description: Edoxen::Enums::ATTENDANCE_RESPONSE.
1348
+ enum:
1349
+ - pending
1350
+ - confirmed
1351
+ - declined
1352
+ - tentative
1353
+ - delegated
1354
+ ComponentKind:
1355
+ type: string
1356
+ description: Edoxen::Enums::COMPONENT_KIND.
1357
+ enum:
1358
+ - track
1359
+ - session
1360
+ - debate
1361
+ - breakout
1362
+ - bof
1363
+ - plenary_session
1364
+ - working_group_session
1365
+ - committee_of_the_whole
1366
+ - keynote
1367
+ - address
1368
+ - statement
1369
+ - question_time
1370
+ - opening
1371
+ - closing
1372
+ - break
1373
+ - reception
1374
+ - registration
1375
+ - networking
1376
+ - other
1377
+ ComponentKindCanonical:
1378
+ type: string
1379
+ description: |
1380
+ Edoxen::Enums::COMPONENT_KIND_CANONICAL — short abstract set
1381
+ (1.0, TODO.refactor/1.0-design).
1382
+ enum:
1383
+ - deliberative
1384
+ - working
1385
+ - ceremonial
1386
+ - break
1387
+ - other
1388
+ OfficerRole:
1389
+ type: string
1390
+ description: Edoxen::Enums::OFFICER_ROLE.
1391
+ enum:
1392
+ - chair
1393
+ - vice_chair
1394
+ - deputy_chair
1395
+ - secretary
1396
+ - treasurer
1397
+ - parliamentarian
1398
+ - presiding_officer
1399
+ - sergeant_at_arms
1400
+ - other
1401
+ RecurrenceFreq:
1402
+ type: string
1403
+ description: Edoxen::Enums::RECURRENCE_FREQ.
1404
+ enum:
1405
+ - secondly
1406
+ - minutely
1407
+ - hourly
1408
+ - daily
1409
+ - weekly
1410
+ - monthly
1411
+ - yearly
1412
+ UrlKind:
1413
+ type: string
1414
+ description: Edoxen::Enums::URL_KIND.
1415
+ enum:
1416
+ - access
1417
+ - report
1418
+ SourceUrlKind:
1419
+ type: string
1420
+ description: Edoxen::Enums::SOURCE_URL_KIND.
1421
+ enum:
1422
+ - agenda_pdf
1423
+ - minutes_pdf
1424
+ - decisions_pdf
1425
+ - report_pdf
1426
+ - register_url
1427
+ - landing_page
1428
+ HostType:
1429
+ type: string
1430
+ description: Edoxen::Enums::HOST_TYPE.
1431
+ enum:
1432
+ - national_body
1433
+ - liaison
1434
+ - associate
1435
+ - organizer
1436
+ VoteType:
1437
+ type: string
1438
+ description: Edoxen::Enums::VOTE_TYPE.
1439
+ enum:
1440
+ - affirmative
1441
+ - negative
1442
+ - abstain
1443
+ - absent
1444
+ - not_applicable
1445
+ DateTimeRange:
1446
+ type: object
1447
+ description: |
1448
+ Start + end pair with sub-day precision. Parallel to DateRange;
1449
+ use when day granularity is insufficient (e.g. a meeting that
1450
+ ran 09:00–11:30).
1451
+ additionalProperties: false
1452
+ properties:
1453
+ start:
1454
+ type: string
1455
+ format: date-time
1456
+ end:
1457
+ type: string
1458
+ format: date-time
1459
+ StatementKind:
1460
+ type: string
1461
+ description: |
1462
+ Discriminator for the three BS 0:2006 statement types. Adding a
1463
+ new kind is a one-line enum extension; the Statement model
1464
+ itself never needs to change (OCP).
1465
+ enum:
1466
+ - statement
1467
+ - comment
1468
+ - standpoint
1469
+ DeclarationKind:
1470
+ type: string
1471
+ description: |
1472
+ Discriminator for the two BS 0:2006 declaration types
1473
+ (conflict of interest, IPR).
1474
+ enum:
1475
+ - conflict_of_interest
1476
+ - ipr
1477
+ Statement:
1478
+ type: object
1479
+ description: |
1480
+ One remark made by one or more meeting members on a topic or a
1481
+ minutes section. Per-field Localized description; party is a
1482
+ list of Person references. The `kind` discriminator separates
1483
+ the three BS 0:2006 statement types.
1484
+ additionalProperties: false
1485
+ properties:
1486
+ kind:
1487
+ "$ref": "#/$defs/StatementKind"
1488
+ description:
1489
+ type: array
1490
+ items:
1491
+ "$ref": "#/$defs/LocalizedString"
1492
+ party:
1493
+ type: array
1494
+ items:
1495
+ "$ref": "#/$defs/Person"
1496
+ extensions:
1497
+ type: array
1498
+ items:
1499
+ "$ref": "#/$defs/MeetingExtension"
1500
+ Declaration:
1501
+ type: object
1502
+ description: |
1503
+ A formal declaration (conflict of interest or IPR) made by one
1504
+ or more meeting members. IPR-specific fields (`ipr_subject_ref`,
1505
+ `ipr_target_ref`) are populated only when `kind == "ipr"`.
1506
+ additionalProperties: false
1507
+ properties:
1508
+ kind:
1509
+ "$ref": "#/$defs/DeclarationKind"
1510
+ description:
1511
+ type: array
1512
+ items:
1513
+ "$ref": "#/$defs/LocalizedString"
1514
+ party:
1515
+ type: array
1516
+ items:
1517
+ "$ref": "#/$defs/Person"
1518
+ ipr_subject_ref:
1519
+ "$ref": "#/$defs/EntityRef"
1520
+ ipr_target_ref:
1521
+ "$ref": "#/$defs/EntityRef"
1522
+ extensions:
1523
+ type: array
1524
+ items:
1525
+ "$ref": "#/$defs/MeetingExtension"
1526
+ Body:
1527
+ type: object
1528
+ description: |
1529
+ A committee, subcommittee, working group, or other organised body.
1530
+ Three-tier entity resolution (ref / local_ref / inline).
1531
+ additionalProperties: false
1532
+ properties:
1533
+ ref:
1534
+ type: string
1535
+ local_ref:
1536
+ type: string
1537
+ code:
1538
+ type: string
1539
+ name:
1540
+ type: array
1541
+ items:
1542
+ "$ref": "#/$defs/LocalizedString"
1543
+ kind:
1544
+ type: string
1545
+ parent_ref:
1546
+ "$ref": "#/$defs/EntityRef"
1547
+ extensions:
1548
+ type: array
1549
+ items:
1550
+ "$ref": "#/$defs/MeetingExtension"
1551
+ BodyRegister:
1552
+ type: object
1553
+ description: |
1554
+ Authoritative register of Bodies (committees, subcommittees,
1555
+ working groups).
1556
+ additionalProperties: false
1557
+ properties:
1558
+ scope:
1559
+ type: string
1560
+ title:
1561
+ type: array
1562
+ items:
1563
+ "$ref": "#/$defs/LocalizedString"
1564
+ bodies:
1565
+ type: array
1566
+ items:
1567
+ "$ref": "#/$defs/Body"
1568
+ extensions:
1569
+ type: array
1570
+ items:
1571
+ "$ref": "#/$defs/MeetingExtension"