Explore the RiC model - every entity, attribute and relation, plain and navigable. Open the model navigator ↗

Part of specification v0.55.1. Earlier versions are preserved as tagged releases.

OpenRiC Mapping Specification

Last revised in: v0.55.0 Status: Active - cross-referenced with RiC-AG (Application Guidelines) v0.1 Last updated: 2026-10-20


✅ RiC-O 1.1 namespace remediation - complete (v0.37.0, 2026-04-25)

This document has been remediated against RiC-O 1.1 (2025-05-22). Every rico:* term emitted as data is canonical 1.1; every term that needed renaming, remodelling, or moving to the OpenRiC extension namespace has been processed across five phases (A → E). The full per-term disposition table and phase summaries are at audit/ric-o-1.1-audit.html.

The remaining rico:* tokens that appear in this document are exclusively in “MUST NOT emit X” warnings explaining what’s not in RiC-O 1.1 - they are documentation prose, not emissions. Implementations of any OpenRiC profile MUST NOT emit them as data.

1. Purpose

This specification defines a deterministic mapping from the traditional archival-description standards - ISAD(G), ISAAR(CPF), ISDIAH, ISDF - to the ICA’s Records in Contexts conceptual model (RiC-CM v1.0) and its ontology (RiC-O v1.1, 2025-05-22).

Given a conforming input description, exactly one conforming RiC graph SHALL result. The mapping is total: every entity in the input has a defined target class in RiC, and every normatively-required ISAD(G)/ISAAR(CPF)/ISDIAH element has a defined target predicate.

A reference implementation exists in the Heratio ahg-ric package (AGPL-3.0) and is the empirical source of this specification.

1.1 Alignment with RiC-O Converter v3.0

This mapping is consistent with the conventions of RiC-O Converter v3.0 (Sparna + AnF Lab, March 2025) - the canonical EAD 2002 / EAC-CPF → RiC-O converter. Where this spec and the Converter make different decisions, the differences are documented:

Institutions migrating existing EAD finding aids can reasonably use the Converter to bootstrap their corpus and an OpenRiC-conformant server (any conformant implementation, not just the reference) to expose the result over HTTP.

1.2 Cross-reference with RiC-AG (Application Guidelines)

This mapping is cross-referenced with RiC-AG v0.1 (ICA-EGAD Application Guidelines, October 2025). RiC-AG ships a crosswalk from the four legacy ICA standards - ISAD(G), ISAAR(CPF), ISDF, ISDIAH - to RiC-CM, which is exactly the source-standard set this mapping spec covers.

OpenRiC treats RiC-AG as the upstream authoritative reference for that crosswalk. Where this spec and RiC-AG agree on a class or property mapping, RiC-AG is canonical and OpenRiC defers. Where they diverge - intentionally or as drift - the divergence is documented:

Implementations of OpenRiC profiles SHOULD treat RiC-AG as the application-pattern reference and this spec as the deployable-API contract. The two are designed to be coherent: RiC-AG answers what to model; OpenRiC answers how to expose it over HTTP.

1.3 Versions cited, what this mapping claims, and what OpenRiC adds

Every mapping row in this document is made against these editions. A newer edition of any of them is not covered until this table names it.

Text Edition this mapping cites Its role here
ISAD(G) Second edition, ICA, 2000 (adopted Stockholm, 1999) Source standard, §7.1
ISAAR(CPF) Second edition, ICA, 2004 Source standard, §7.3
ISDIAH First edition, ICA, 2008 Source standard, §7.4
ISDF First edition, ICA, 2007 Source standard, §6.4
RiC-CM 1.0, ICA EGAD, 2023 Target conceptual model
RiC-O 1.1, 2025-05-22 Target ontology; every rico: term emitted as data
RiC-AG 0.1, ICA EGAD, October 2025 Upstream crosswalk, authoritative where it covers a field (§1.2)
RiC-O Converter 3.0, Sparna and AnF Lab, March 2025 Alignment reference (§1.1); not a dependency

What this mapping does not claim.

What OpenRiC adds on top of RiC. None of the following is part of Records in Contexts.

Layer Where it is defined Status
openricx: extension terms (list envelopes, the interim openricx:Function class, contact points, date-range sets, ISAD(G) notes with no RiC-O predicate, checksums and MIME types, personal-data and appraisal flags) /ns/ext/v1 Published; candidates for upstream proposal, never presented as rico:
openric: API terms (list envelopes, service description, errors, subgraphs, nodes, edges, layout hints) and the localType, jurisdiction and role annotations /ns/v1, with their use in Graph Primitives and the profiles Published 2026-10-15 (O-6)
HTTP API, profiles, JSON Schemas, SHACL shapes, fixtures and the API contract This specification Versioned with the spec (change control)

2. Terminology & conformance

The keywords MUST, MUST NOT, SHOULD, SHOULD NOT, MAY in this document are to be interpreted as described in RFC 2119.

An implementation is any system that accepts archival-description input in a form compatible with the source schemas and emits RiC output. A conformant implementation passes all L1 test fixtures in the conformance suite.

3. Source schemas

This specification covers mapping from the following input entity types. Named after their canonical AtoM/Qubit tables; implementations MAY use different internal storage as long as the externally-visible semantics match.

Source entity Source standard Example table
Information Object ISAD(G) information_object + information_object_i18n
Actor ISAAR(CPF) actor + actor_i18n
Repository ISDIAH repository + repository_i18n
Function ISDF function + function_i18n
Event (AtoM extension) event
Physical Object (AtoM extension) thing / storage / container

4. Normative prefixes

Implementations MUST emit JSON-LD or Turtle with these prefixes bound as shown, unless otherwise indicated by content negotiation:

@prefix rico:    <https://www.ica.org/standards/RiC/ontology#> .
@prefix openricx: <https://openric.org/ns/ext/v1#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .
@prefix skos:    <http://www.w3.org/2004/02/skos/core#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix owl:     <http://www.w3.org/2002/07/owl#> .

API terms - list envelopes, the service description, errors, graph primitives - and three entity annotations (localType, jurisdiction, role) use the prefix below, defined by the OpenRiC API vocabulary:

@prefix openric: <https://openric.org/ns/v1#> .

5. Identity & URI scheme

Every emitted RiC entity MUST have a stable, dereferenceable @id.

The canonical form is:

{baseUri}/{entity-path}/{slug-or-id}

Where:

Example: https://archives.example.org/informationobject/AHG-A001-fonds-smuts.

A server MAY additionally mint RiC-native UUIDs (e.g. https://openric.org/id/{uuid}) for external interchange. When present, these MUST be related to the canonical identifier via owl:sameAs.


6. Class mapping

6.1 Information Object → rico:RecordSet / rico:Record / rico:RecordPart

The RiC class is selected from the ISAD(G) level of description term:

Source level RiC class
fonds rico:RecordSet
subfonds rico:RecordSet
collection rico:RecordSet
series rico:RecordSet
subseries rico:RecordSet
file rico:RecordSet
item rico:Record
part rico:RecordPart
(fallback - unknown level) rico:Record

Implementations MAY extend this table for local levels but MUST preserve the RecordSet / Record / RecordPart coarse distinction.

6.2 Actor → rico:Agent hierarchy

Selected from the ISAAR(CPF) type of entity term, extended with mechanism for software systems that perform provenance-significant activities (see §10):

Source actor type RiC class
corporate body rico:CorporateBody
person rico:Person
family rico:Family
mechanism rico:Mechanism
(fallback - unknown type) rico:Agent

rico:Mechanism is a canonical RiC-O 1.1 subclass of rico:Agent, used for software systems, devices, importers, AI services, OCR pipelines, and other automated agents whose actions on records can be attributed in provenance. ICA-EGAD examples (Florence Clavaud, RiC user group #27) include scanners and digital cameras as Mechanisms participating in digitisation Activities.

6.3 Repository → rico:CorporateBody

Repositories (ISDIAH institutions) are always emitted as rico:CorporateBody. They are distinguished from other CorporateBody instances by:

6.4 Function → openricx:Function (interim) - see canonical alternatives below

RiC-O 1.1 does not define rico:Function as a class, and ICA-EGAD guidance (Florence Clavaud, RiC user group) is that an archival/business function is best modelled in canonical RiC-O as either:

  1. A SKOS Concept in a function-classification ConceptScheme (when the function is a vocabulary term), with rico:Activity instances classified by it, OR
  2. A rico:Activity with rico:hasActivityType <…function-type IRI…> (when the function manifests as a concrete event).

OpenRiC currently exposes ISDF function records through the /functions API surface and serializes them as openricx:Function as an interim canonical class, pending: (a) a SKOS function-type vocabulary publication, and (b) an upstream proposal to ICA-EGAD if the community converges on a canonical class. Implementations claiming the Authority & Context profile MUST NOT emit rico:Function (which is not in RiC-O 1.1).

There is no canonical “performs this function” property in RiC-O 1.1. Where the source data has an Activity that is an instance of a Function, link via the SKOS classification on the Activity’s rico:hasActivityType, not via a rico:hasActivity predicate (which is not in RiC-O 1.1).

6.5 Event → rico:Activity + rico:hasActivityType

RiC-O 1.1 does not define rico:Production, rico:Accumulation, rico:CustodyEvent, rico:Transfer, or any other concrete rico:Activity subclass - only the parent class rico:Activity is canonical. Earlier OpenRiC drafts (≤ v0.36) emitted rico:Production / rico:Accumulation as concrete classes; this was a non-conformant assumption flagged by the RiC-O 1.1 audit.

The current pattern is: every event MUST be typed as rico:Activity and MUST carry a rico:hasActivityType IRI from the OpenRiC activity-type vocabulary:

Source event type RiC class rico:hasActivityType (IRI)
creation rico:Activity <https://openric.org/vocab/activity-type/production>
contribution rico:Activity <https://openric.org/vocab/activity-type/production>
accumulation rico:Activity <https://openric.org/vocab/activity-type/accumulation>
collection rico:Activity <https://openric.org/vocab/activity-type/accumulation>
custody rico:Activity <https://openric.org/vocab/activity-type/custody>
transfer rico:Activity <https://openric.org/vocab/activity-type/transfer>
publication rico:Activity <https://openric.org/vocab/activity-type/publication>
reproduction rico:Activity <https://openric.org/vocab/activity-type/reproduction>
(fallback - unknown event type) rico:Activity (none - preserve in openric:localType)

The activity-type IRIs MAY be modelled as a SKOS concept scheme in a future release; today they are dereferenceable identifiers only. Implementations MAY mint local activity-type IRIs (e.g. <https://archives.example.org/vocab/activity-type/migration>) for site-specific event kinds, but MUST also emit openric:localType so consumers without the local vocabulary can still dispatch.

6.6 Physical storage → openricx:Container in a rico:Place

RiC-O 1.1 has no container or storage class. From v0.55.0 (extension ontology 1.6.0):

Source thing type RiC class Typed with
box, folder, container, crate, map drawer openricx:Container openricx:hasContainerType
shelf_unit, cabinet, vault, strongroom, room, building rico:Place rico:hasOrHadPlaceType
equipment rico:Thing openric:localType

A server that emits a container as rico:Thing with openric:localType, as this section prescribed before v0.55.0, remains conformant: openricx:Container is a subclass of rico:Thing, and a consumer that dispatches on rico:Thing reads both.


7. Property mapping

7.1 Information Object (ISAD(G))

ISAD(G) element RiC predicate Notes
3.1.1 Reference code rico:identifier  
3.1.2 Title rico:title Language-tagged per culture
3.1.3 Date(s) openricx:hasDateRangeSet → openricx:DateRange See §7.2. The API shape; in RDF it expands to rico:hasCreationDate, rico:hasBeginningDate and rico:hasEndDate → rico:Date (RiC-AG)
3.1.4 Level of description (drives class, see §6.1), and rico:hasRecordSetType → rico:RecordSetType on a RecordSet The class alone loses the level name; RiC-AG §5.3.1
3.1.5 Extent and medium rico:hasExtent → rico:RecordResourceExtent (a rico:Extent), the text on rico:textualValue; a counted extent carries rico:quantity and rico:hasUnitOfMeasurement → rico:UnitOfMeasurement rico:hasExtentType is an object property (Extent to rico:ExtentType); until v0.54.0 the extent text was sent on it as a literal, which is deprecated and may be sent beside rico:textualValue until v0.55.0
3.2.1 Name of creator(s) rico:hasCreator → rico:Agent  
3.2.2 Administrative / biographical history rico:history On the Agent, not the Record
3.2.3 Archival history rico:history on the Record Free-text
3.2.4 Immediate source of acquisition rico:isOrWasAffectedBy → rico:Activity (activity type transfer) with rico:hasOrHadParticipant → the source rico:Agent Was rico:hasOrganicProvenance, which names the creator or accumulator, not the source (RiC-AG)
3.3.1 Scope and content rico:scopeAndContent Was openricx:description, deprecated in v0.46.0 and no longer sent on records from v0.49.0
3.3.2 Appraisal, destruction, scheduling openricx:hasAppraisalInformation  
3.3.3 Accruals rico:accruals RiC-O 1.1 property; openricx:accrualsNote (v0.44.0) is deprecated
3.3.4 System of arrangement rico:structure Was openricx:arrangement (deprecated)
3.4.1 Conditions governing access rico:conditionsOfAccess  
3.4.2 Conditions governing reproduction rico:conditionsOfUse  
3.4.3 Language/scripts of material On a rico:Record or rico:RecordPart: rico:hasOrHadLanguage → rico:Language. On a rico:RecordSet: rico:hasOrHadAllMembersWithLanguage when one language is given, rico:hasOrHadSomeMembersWithLanguage when several are RiC-O 1.1 limits rico:hasOrHadLanguage to Agent, Record and RecordPart. Until v0.50.0 OpenRiC sent it on record sets too, outside its domain. The record-set rule follows the RiC-O Converter
3.4.4 Physical characteristics rico:physicalCharacteristicsNote on the record’s rico:Instantiation Was rico:hasCarrierType, which names the carrier, not its condition
3.4.5 Finding aids rico:isOrWasDescribedBy → finding-aid Record (which carries rico:hasDocumentaryFormType <https://www.ica.org/standards/RiC/vocabularies/documentaryFormTypes#FindingAid>) Canonical RiC-O 1.1 pattern per Florence Clavaud (RiC user group) - FindingAid is a concept in RiC-O’s documentary-form-type vocabulary, not a separate property. Earlier versions gave the IRI as ontology#FindingAid, which does not exist
3.5.1 Existence and location of originals rico:hasOrHadLocation  
3.5.2 Existence and location of copies rico:hasOrHadInstantiation  
3.5.3 Related units of description rico:isRelatedTo  
3.5.4 Publication note openricx:publicationInformation  
3.6.1 Note rico:generalDescription Was rdfs:comment
3.7.1 Archivist’s note openricx:descriptiveNote  
3.7.2 Rules or conventions rico:isOrWasRegulatedBy → rico:Rule Links to the ISAD/RAD/DACS rule; dcterms:conformsTo MAY also be sent
3.7.3 Dates of description openricx:hasDateRangeSet (descriptive) Distinct from record dates
(Subjects / access points) rico:hasOrHadSubject  
(Parent) rico:isOrWasIncludedIn Inverse: rico:includesOrIncluded
(Children) rico:includesOrIncluded  
(Repository) rico:hasOrHadHolder → rico:CorporateBody  

7.2 Date ranges

Dates are emitted as openricx:DateRange objects:

{
  "@type": "openricx:DateRange",
  "rico:beginningDate": { "@value": "1899-10-11", "@type": "xsd:date" },
  "rico:endDate":   { "@value": "1902-05-31", "@type": "xsd:date" },
  "rico:normalizedDateValue": "1899-10-11/1902-05-31",
  "rico:hasDateType": { "@id": "https://openric.org/vocab/date-type/existence" }
}

openricx:DateRange is a subclass of rico:Date. Literal values go on the datatype properties rico:beginningDate, rico:endDate and, for free text, rico:date; the object properties rico:hasBeginningDate, rico:hasEndDate, rico:hasCreationDate and the rest point from an entity to a rico:Date node and never carry a literal.

rico:hasDateType is an object property whose range is rico:DateType, so its value is a concept from the OpenRiC date-type vocabulary: existence, creation, accumulation, descriptive or custody. Until v0.50.0 it was sent as a plain string with those names.

7.3 Actor (ISAAR(CPF))

ISAAR(CPF) element RiC predicate
5.1.1 Type of entity (drives class: rico:Person, rico:CorporateBody or rico:Family, see §6.2)
5.1.2 Authorised form of name rico:name, also openricx:normalizedForm
5.1.3 Parallel forms of name openricx:alternativeForm
5.1.4 Standardised forms (other rules) openricx:alternativeForm
5.1.5 Other forms of name openricx:otherName
5.1.6 Identifiers rico:identifier
5.2.1 Dates of existence openricx:hasDateRangeSet with rico:hasDateType → existence; when the source holds them only as free text, rico:date on the agent; in RDF rico:hasBirthDate / rico:hasDeathDate (persons) or rico:hasBeginningDate / rico:hasEndDate → rico:Date
5.2.2 History rico:history
5.2.3 Places rico:isAssociatedWithPlace → rico:Place
5.2.4 Legal status rico:hasOrHadLegalStatus → a rico:LegalStatus node carrying the status as rico:name (an object property; not a plain string)
5.2.5 Functions, occupations, activities rico:performsOrPerformed → openricx:Function (interim, see §6.4); for a person, rico:hasOrHadOccupationOfType → a SKOS Concept of rico:OccupationType (RiC-O 1.1, domain rico:Person); for other agents, or an occupation held only as text, openricx:hasOccupation. RiC user group #20 (Aaron Hope, Florence Clavaud) endorses SKOS individuals of OccupationType; the fuller expansion is an Activity typed by an OccupationType IRI per §6.5
5.2.6 Mandates / sources of authority rico:authorizingMandate → rico:Mandate
5.2.7 Internal structures / genealogy openricx:hasInternalStructure
5.2.8 General context openricx:generalContext
5.3.x Relationships isOrWas...Of property family (e.g. rico:isOrWasOwnerOf, rico:isOrWasHolderOf) - see §8
5.4.x Control area See §7.5

7.4 Repository (ISDIAH)

ISDIAH element RiC predicate
5.1.1 Identifier rico:identifier
5.1.2 Authorized form of name rico:name
5.1.3 Parallel / other forms openricx:alternativeForm, openricx:otherName
5.1.5 Type of institution openricx:institutionType
5.2.1 Location and address rico:hasOrHadLocation → rico:Place with openricx:streetAddress
5.2.2 Telephone, fax, email openricx:contact → openricx:ContactPoint
5.3.1 History of the institution rico:history
5.3.2 Geographical and cultural context openricx:generalContext
5.3.3 Mandates / sources of authority rico:authorizingMandate
5.3.4 Administrative structure openricx:hasInternalStructure
5.3.5 Records management policies openricx:hasOrHadPolicy
5.3.6 Building(s) rico:hasOrHadLocation
5.3.7 Archival and other holdings rico:isOrWasHolderOf → rico:RecordSet / rico:Record
5.3.8 Finding aids rico:isOrWasDescribedBy → finding-aid Record with rico:hasDocumentaryFormType <…#FindingAid>
5.4.1 Opening times openricx:openingHours
5.4.2 Conditions and requirements for access rico:conditionsOfAccess
5.4.3 Accessibility openricx:accessibility
5.2.3 Contact persons openricx:contact → openricx:ContactPoint; a named person as rico:Person with rico:hasOrHadPosition
5.5.1 Research services rico:performsOrPerformed → rico:Activity, or text in rico:generalDescription
5.5.2 Reproduction services As 5.5.1
5.5.3 Public areas rico:hasOrHadLocation → rico:Place, with rico:generalDescription
5.6.x Control area See §7.5

7.5 Control areas (ISAAR(CPF) 5.4, ISDF 5.4, ISDIAH 5.6)

Following RiC-AG §5.3.4, a description is itself a rico:Record that rico:describesOrDescribed the entity and rico:resultsOrResultedFrom the rico:Activity that produced it.

Element RiC-O 1.1
Description identifier (5.4.1 / 5.6.1) rico:identifier on the describing Record
Institution identifier (5.4.2 / 5.6.2) The describing Record rico:resultsOrResultedFrom an Activity that rico:isOrWasPerformedBy the institution
Rules and/or conventions (5.4.3 / 5.6.3) rico:isOrWasRegulatedBy → rico:Rule
Status (5.4.4 / 5.6.4) No RiC-O 1.1 property; text in rico:generalDescription
Level of detail (5.4.5 / 5.6.5) rico:generalDescription
Dates of creation, revision or deletion (5.4.6 / 5.6.6) rico:hasCreationDate and rico:hasModificationDate → rico:Date
Language(s) and script(s) (5.4.7 / 5.6.7) rico:hasOrHadLanguage → rico:Language
Sources (5.4.8 / 5.6.8) rico:generalDescription
Maintenance notes (5.4.9 / 5.6.9) rico:generalDescription

7.6 Function (ISDF)

OpenRiC serves functions as openricx:Function (§6.4). RiC-AG maps ISDF to rico:Activity; the properties below apply to either.

ISDF element RiC predicate
5.1.1 Type rico:hasActivityType
5.1.2 Authorised form(s) of name rico:name
5.1.3 Parallel form(s) of name openricx:alternativeForm
5.1.4 Other form(s) of name openricx:otherName
5.1.5 Classification rico:classification
5.2.1 Dates rico:hasBeginningDate / rico:hasEndDate → rico:Date; free text in rico:date
5.2.2 Description rico:generalDescription
5.2.3 History rico:history
5.2.4 Legislation rico:isOrWasRegulatedBy → rico:Rule
5.3.x Related functions rico:isRelatedTo, or rico:followsInTime / rico:isOrWasPartOf where the relation is known
5.4.x Control area See §7.5

8. Relationships

Relationships between actors (ISAAR(CPF) 5.3) and between records (ISAD(G) 3.5.3) are emitted as properties of the source entity pointing at the target. Where RiC-O has a directed predicate, the source is the subject and the target is the object.

The commonest ISAAR relationships map to:

ISAAR relationship RiC predicate
Hierarchical: parent body rico:isOrWasSubordinateTo
Hierarchical: subordinate body rico:hasOrHadSubordinate
Family: member of family rico:isOrWasMemberOf
Associative: successor of rico:followsInTime
Associative: predecessor of rico:precedesInTime
Associative: related to rico:isRelatedTo
Temporal: controlled by (during period) rico:hasOrHadController (Agent → Agent; reify as rico:AgentControlRelation with date-scoping when needed)

Each relation MAY carry a rico:Relation reified object when date-scoping, certainty, or provenance are required:

{
  "@type": "rico:FamilyRelation",
  "rico:relationHasSource": "…/actor/smuts-jc",
  "rico:relationHasTarget": "…/actor/smuts-family",
  "openricx:hasDateRangeSet": { "@type": "openricx:DateRange", "rico:beginningDate": "1870-05-24" },
  "rico:relationCertainty": "asserted"
}

9. Access, security, and privacy extensions

RiC-O 1.1 does not define AccessRestriction or SecurityClassification as classes, and does not define hasAccessRestriction / hasAccessRule / hasSecurityClassification as properties. The canonical pattern is:

OpenRiC rule-type IRIs (subset - a SKOS ConceptScheme will be published at <https://openric.org/vocab/rule-type/>):

IRI Meaning
<https://openric.org/vocab/rule-type/access-restriction> Scoped restriction - time, role, purpose
<https://openric.org/vocab/rule-type/security-classification> Classification code (e.g. “Confidential”, “Restricted”)
<https://openric.org/vocab/rule-type/access-rule> General access governance

Privacy / personal-data flag remains an OpenRiC extension property because RiC-O 1.1 does not yet model it:

Property Domain Range Meaning
openricx:containsPersonalData rico:Record / rico:RecordSet xsd:boolean True if the record is known to contain personally identifiable information

Example - a record regulated by an access-restriction Rule:

<.../record/abc> rico:isOrWasRegulatedBy <.../rule/popia-2026> .
<.../rule/popia-2026> a rico:Rule ;
    rico:title "POPIA section 14 - personal data" ;
    rico:hasOrHadRuleType <https://openric.org/vocab/rule-type/access-restriction> .

Jurisdictional compliance regimes (POPIA, GDPR, CDPA, IPSAS, GRAP 103, PAIA, NAZ, NMMZ …) are out of scope for OpenRiC. They are expressed by pluggable per-jurisdiction layers on top of these base properties.


10. Systems, APIs, and Mechanisms

OpenRiC distinguishes between three layers that are sometimes conflated:

Layer Examples RiC treatment
API surface (HTTP route) /records, /agents, /repositories, /functions Not a RiC-CM entity. Developer-facing access point.
OpenRiC application concept “Repository”, “Function”, “Importer” Useful for archivists / UI labels; mapped to canonical RiC entities below.
Canonical RiC-CM/RiC-O entity rico:Record, rico:Agent, rico:CorporateBody, rico:Activity, rico:Mechanism The semantic identity in the graph.

API routes such as /records, /agents, /repositories, and /functions are convenience surfaces. They do not, by themselves, define new RiC-CM classes. Where an API surface corresponds directly to a RiC-CM entity, OpenRiC serializes the resource using the canonical RiC-O class. Where a route exists for archival usability (e.g. /repositories, /functions), the canonical graph representation maps the object to the closest RiC-CM/RiC-O construct (CorporateBody for repositories per §6.3; openricx:Function interim for functions per §6.4).

10.1 Software systems are rico:Mechanism

rico:Mechanism is a canonical RiC-O 1.1 subclass of rico:Agent. It is the correct class for any software system, device, service, or automated process that performs provenance-significant activities against records. ICA-EGAD direct guidance (Florence Clavaud, RiC user group thread #27) gives scanners and digital cameras as canonical examples; the same pattern extends to:

Thing RiC class
Importer (e.g. EAD-to-RiC converter) rico:Mechanism
OCR / handwriting-recognition pipeline rico:Mechanism
AI description / NER / summarisation model rico:Mechanism
Migration script rico:Mechanism
Validation engine rico:Mechanism
Crawler / harvester rico:Mechanism
API platform / service (when itself the actor of an event) rico:Mechanism

The actions performed by these mechanisms are modelled as rico:Activity instances, linked back via rico:isOrWasPerformedBy (or its inverse rico:performsOrPerformed on the Mechanism), and to the affected records via rico:resultsOrResultedIn / rico:affectsOrAffected.

10.2 Example - OpenRiC importer converting EAD to RiC-O

@prefix rico:     <https://www.ica.org/standards/RiC/ontology#> .
@prefix openric:  <https://openric.org/id/> .
@prefix openricx: <https://openric.org/ns/ext/v1#> .

openric:mechanism/openric-importer a rico:Mechanism ;
    rico:name "OpenRiC EAD-to-RiC importer" ;
    openricx:technicalCharacteristics
        "Python/Laravel/Fuseki conversion service" .

openric:activity/conversion-2026-04-25 a rico:Activity ;
    rico:hasActivityType <https://openric.org/vocab/activity-type/transfer> ;
    rico:name "EAD to RiC-O conversion" ;
    rico:isOrWasPerformedBy openric:mechanism/openric-importer ;
    rico:resultsOrResultedIn openric:record/imported-graph-001 ;
    rico:isAssociatedWithDate [
        a openricx:DateRange ;
        rico:beginningDate "2026-04-25T08:00:00Z"^^xsd:dateTime
    ] .

This pattern keeps the OpenRiC HTTP/API layer cleanly separated from the canonical archival graph: the /import API endpoint is not a RiC entity, but the importer that the endpoint dispatches to is a rico:Mechanism whose conversions can be attributed in provenance.


11. Canonical example - fonds with subordinate series

Input (abbreviated AtoM-shape JSON)

{
  "informationObject": {
    "identifier": "AHG-A001",
    "title": "Papers of Jan Christian Smuts",
    "level_of_description": "fonds",
    "scope_and_content": "Correspondence, diaries, speeches, 1886-1950.",
    "dates": [{ "start_date": "1886-01-01", "end_date": "1950-09-11" }],
    "extent_and_medium": "3.2 linear metres, 18 boxes",
    "language": ["eng", "afr"],
    "repository_id": 14,
    "creator_id": 201,
    "children": [
      { "identifier": "AHG-A001-01", "level_of_description": "series",
        "title": "Correspondence" }
    ]
  }
}

Output (RiC-O JSON-LD)

{
  "@context": {
    "rico": "https://www.ica.org/standards/RiC/ontology#",
    "xsd":  "http://www.w3.org/2001/XMLSchema#"
  },
  "@id":   "https://archives.example.org/informationobject/AHG-A001",
  "@type": "rico:RecordSet",
  "rico:identifier": "AHG-A001",
  "rico:title": { "@value": "Papers of Jan Christian Smuts", "@language": "en" },
  "rico:scopeAndContent": "Correspondence, diaries, speeches, 1886-1950.",
  "openricx:hasDateRangeSet": {
    "@type": "openricx:DateRange",
    "rico:beginningDate": { "@value": "1886-01-01", "@type": "xsd:date" },
    "rico:endDate":   { "@value": "1950-09-11", "@type": "xsd:date" },
    "rico:hasDateType": { "@id": "https://openric.org/vocab/date-type/creation" }
  },
  "rico:hasExtent": {
    "@type": "rico:RecordResourceExtent",
    "rico:textualValue": "3.2 linear metres, 18 boxes"
  },
  "rico:hasOrHadLanguage": [
    { "@type": "rico:Language", "openricx:languageCode": "eng" },
    { "@type": "rico:Language", "openricx:languageCode": "afr" }
  ],
  "rico:hasOrHadHolder": {
    "@id": "https://archives.example.org/repository/wits-historical-papers",
    "@type": "rico:CorporateBody",
    "rico:name": "Wits Historical Papers Research Archive"
  },
  "rico:hasCreator": {
    "@id": "https://archives.example.org/actor/smuts-jc",
    "@type": "rico:Person",
    "rico:name": "Smuts, Jan Christian"
  },
  "rico:includesOrIncluded": [
    {
      "@id": "https://archives.example.org/informationobject/AHG-A001-01",
      "@type": "rico:RecordSet",
      "rico:identifier": "AHG-A001-01",
      "rico:title": "Correspondence"
    }
  ]
}

12. Open issues


13. Change log

Version Date Notes
v0.55.0 2026-10-20 6.6 Physical storage: a container is an openricx:Container with an openricx:ContainerType, what it holds points to it with openricx:isOrWasStoredIn, and it is placed in a rico:Place with rico:hasOrHadLocation; shelves, strongrooms and buildings are places. rico:Thing with openric:localType stays conformant.
v0.54.0 2026-10-20 3.1.5 Extent: the text goes on rico:textualValue of a rico:RecordResourceExtent, and a counted extent on rico:quantity with rico:hasUnitOfMeasurement; a literal on rico:hasExtentType, an object property, is deprecated.
v0.46.0 2026-10-15 O-8 resolved: §7 rows follow RiC-AG with RiC-O 1.1 terms (scope and content, structure, notes, rules, physical characteristics, acquisition, date expansion, record set type); new §7.5 control areas and §7.6 ISDF.
v0.45.0 2026-10-15 Compared row by row with RiC-AG (audit page; O-8 registered); 3.3.3 maps to rico:accruals; ISDIAH type of institution renumbered 5.1.5.
v0.44.0 2026-10-15 Add §1.3: the editions every row is made against, what the mapping does not claim (ICA endorsement, lossless legacy round trip, full RiC-AG agreement, RiC conformance), and what OpenRiC adds on top of RiC. Register and resolve O-6 (publish the openric: API vocabulary; four mapping-only terms move to openricx:) and O-7 (Governance profile pin brought to RiC-O 1.1).
0.38.1 2026-05-25 Add §1.2 cross-reference with RiC-AG v0.1 - treat RiC-AG as upstream-authoritative for the legacy-ICA-standards-to-RiC-CM crosswalk; document intentional openricx: divergences as upstream-proposal candidates; flag the forthcoming EAC-CPF → RiC-O 1.1 mapping for cross-reference when it lands.
0.37.0 2026-04-25 RiC-O 1.1 namespace remediation complete (Phases A-E); all rico:* terms emitted as data are canonical 1.1; per-term audit at /audit/ric-o-1.1-audit.html.
0.1.0-draft 2026-04-17 Initial draft extracted from Heratio ahg-ric reference implementation.

Back to OpenRiC