Edoxen is a generic, semantically clear information model for meetings, agendas, and the decisions they produce. It provides a common framework that allows interoperability between standards bodies, parliaments, conferences, corporate boards, technical communities, and any other organization that runs formal meetings with published records.
This repository holds the canonical LutaML UML definition of the model. The Ruby gem that implements it lives at metanorma/edoxen and mirrors the LutaML files 1:1 — attribute declarations, enum values, and field shapes.
The model is GENERIC. Core entities cover every domain; profile extensions (ISO 8601-2 §15) cover domain-specific concepts.
Tested against (see references/):
-
Standards bodies: ISO, ISO/TMB, ITU-T, ITU-D, WTSA, BIPM/CGPM, OIML, ILO
-
Parliamentary: UK Hansard, HK LegCo (16 OData entities), US Congress (govinfo CHRG)
-
Technical community: IETF (multi-track), W3C TPAC, Apache Foundation
-
Academic conferences: Crossref-registered (ACM, IEEE, Springer)
-
Corporate governance: Apache Board, general corporate boards
-
Generic web/virtual: iCalendar (RFC 5545/7986/5546/9253) semantics
The core schema is the intersection of all meeting domains — every meeting has identity, time, place, people, agenda, decisions, minutes. Domain-specific concepts (Bill, Witness, Petition, Address, Statement, QuorumBell, etc.) live in profile extensions, not in the core.
Every core entity has an extensions: MeetingExtension[0..*] slot.
Adopters register their own profile namespace (e.g. legco,
us-congress, ietf, apache-board) and define extension kinds
within it. See references/profiles/legco.adoc for the canonical
example.
This pattern follows ISO 8601-2 §15 (Profiles) — see
references/iso8601-2.adoc.
The information models are in the LutaML UML format.
See the models/ directory. One .lutaml file per concept,
organized by concern:
| File | Concept |
|---|---|
Identity & classification |
|
A single Meeting (event) with all broadened-scope fields. |
|
Top-level wrapper for many Meetings. |
|
Parent of recurring meetings (Crossref |
|
Lightweight venue + date reference. |
|
|
|
Closed value set: plenary, working_group, committee, conference, hearing, markup, board_meeting, etc. |
|
Status + access classification (public/private/confidential). |
|
Directed links, aligned to RFC 9253 RELTYPE. |
Time & place |
|
ISO 8601-2 §10 time interval. |
|
ISO 8601-2 §13 structured, queryable. |
|
Recurrence subcomponents. |
|
Polymorphic base class (kind discriminator + common fields). |
|
|
|
|
|
Closed value sets. |
Structure |
|
The business-order document of a Meeting. |
|
One entry on an Agenda (carries |
|
Flat sub-events (track, session, debate, opening, closing, break, etc.). |
|
18 values: substantive + procedural (subsumes ScheduleItem). |
|
Per-language content for a Component. |
|
A time-bound requirement. |
People |
|
Identity + contact + affiliation + kind. |
|
Chair/secretary/treasurer/etc. with role enum. |
|
One record per person present, with |
|
In-meeting observation enum. |
|
iCalendar ROLE, plain English (chair/required/optional/non_participant). |
|
iCalendar PARTSTAT, plain English (pending/confirmed/declined/tentative/delegated). |
Outcomes (procedural core) |
|
Base type for formal outcomes (was Resolution). |
|
9 values: resolution, order, ruling, determination, recommendation, statement, finding, opinion, other. |
|
State machine: draft → proposed → under_consideration → decided/negatived/withdrawn/deferred. |
|
Top-level Decision container. |
|
Typed dates (adoption, drafted, decided, etc.). |
|
Directed links between Decisions. |
|
Procedural act with 9-state machine: introduced → seconded → debating → question_put → voting → carried/negatived/withdrawn/lapsed. |
|
State machine: called → in_progress → decided/withdrawn/deferred. |
|
Enums. |
|
ayes / noes / abstentions / absent counts. |
|
Per-person vote; links to Voting via |
Topics |
|
Subject of discussion with status + cross-meeting |
|
open / under_discussion / decided / deferred / withdrawn. |
|
Text-bearing (bill, draft, report). |
|
Non-text (image, dataset, model, video). |
|
Generic external pointer. |
Records |
|
The narrative record of a Meeting (one per language). |
|
Section of Minutes (typically keyed by agenda-item). |
|
Glossarist-style per-language content. |
Sources |
|
URLs — generic and per-language source PDFs. |
Hosts |
|
Typed reference to an organization. |
Identity (Decision-side) |
|
Structured body for a Decision’s subject (committee/WG/project). |
|
Per-localization action statements. |
|
Per-localization consideration statements. |
|
Per-localization approval statements. |
Profile mechanism (ISO 8601-2 §15) |
|
Profile-based extension: |
|
A Meeting owns five distinct artifacts, each with its own lifetime and structure:
| Artifact | Concept |
|---|---|
|
The business order, drafted before the meeting. Items, opening_session, closing_session, source_doc. |
|
The formal outcomes adopted by the meeting. Joined to the Meeting by URN. |
|
The running narrative record of what was said at the meeting. |
|
Procedural acts that bring decisions (someone says "I move that…"). State machine. |
|
State-machine votings on motions, with per-member vote records. |
Plus five Meeting-side collections:
| Collection | Concept |
|---|---|
|
One |
|
Chair, secretary, treasurer, etc. with role enum. |
|
Organizations hosting the Meeting. |
|
Polymorphic: physical (with UNLOCODE/IATA) or virtual (with URI/features). |
|
Flat sub-events: tracks, sessions, debates, breaks, openings, closings. |
A Meeting has multiple Venue instances, each either PhysicalVenue
or VirtualVenue. This is polymorphic via inheritance (LutaML
class PhysicalVenue < Venue), NOT via composition.
venues:
- kind: physical
name: BIML Headquarters, Salle Turgot
physicalVenue:
unlocode: FRPAR
address: 11 Rue Turgot, 75009 Paris, France
countryCode: FR
lat: 48.8761
lon: 2.3395
- kind: virtual
name: Main Video Conference
label: Zoom — Host
virtualVenue:
uri: https://oiml.zoom.us/j/12345
passcode: "secret"
features: [audio, video, screen]
- kind: virtual
name: International Dial-in
label: Phone bridge
virtualVenue:
uri: tel:+33-1-2345-6789,,,12345#
features: [phone, audio]The model supports multilingual meeting sets using the
glossarist-style localizations[] pattern. Each Decision,
Meeting, MeetingComponent, and Topic carries its
language-agnostic admin fields plus a localizations[] array
with one entry per language.
Each Localization declares its languageCode (ISO 639-3
three-letter code) and script (ISO 15924 four-letter code).
The LutaML files use camelCase for attribute names
(agendaItem, languageCode, dateEffective). That is
notation. The YAML wire form is snake_case
(agenda_item, language_code, date_effective) — matching
Ruby and YAML convention.
The Ruby gem’s schema_enum_sync_spec.rb and
schema_model_sync_spec.rb enforce that the gem’s
schema/edoxen.yaml matches the LutaML definition value-for-value.
Every core entity has an extensions: MeetingExtension[0..*] slot.
Adopters define their own profile namespace and the extension
kinds within it.
extensions:
- profile: legco
kind: summoning_bell
attributes:
- key: sectionCode
value: b2d
- key: timestamp
value: "2024-01-15T11:30:00Z"See:
- models/meeting_extension.lutaml, models/extension_attribute.lutaml
- references/profiles/legco.adoc — canonical example (8 extension kinds)
The Ruby gem at metanorma/edoxen implements this model:
-
One Ruby class per LutaML class, attribute declarations mirror the LutaML definitions 1:1.
-
Edoxen::Enumsmirrors the LutaML enums; the schema’s enum arrays are kept in lockstep by the gem’s sync specs. -
Edoxen::Decision#in_language(code, fallback:)and#primary_localizationprovide the canonical lookup accessors. The same accessors exist onEdoxen::Meeting. -
JSON-Schemas (
schema/edoxen.yamlfor Decisions,schema/meeting.yamlfor Meetings) enforceadditionalProperties: false,required,enum, andpatternconstraints. -
A Thor CLI wraps both layers:
edoxen validate/edoxen normalizefor Decisions;edoxen validate-meetings/edoxen normalize-meetingsfor Meetings.
Install:
gem install edoxenValidate either document type:
edoxen validate "decisions/*.yaml"
edoxen validate-meetings "meetings/*.yaml"The references/ directory contains 9 reference documents that
ground the model in real-world source data:
-
icalendar.adoc— RFC 5545/7986/5546/9253 (logistics layer) -
schema-org-event.adoc— public-web event vocabulary -
akoma-ntoso.adoc— UN/FAO parliamentary proceedings -
ietf.adoc— multi-track technical meetings -
apache-board.adoc— corporate-style published minutes -
congress-gov.adoc— US Congressional Hearings (govinfo CHRG) -
hansard.adoc— HK LegCo OData (16 entity types) -
crossref-conference.adoc— academic conference proceedings -
iso8601-2.adoc— ISO 8601-2 §10/§11/§13/§15 (date/time/recurrence/profiles)