diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/ApproximationStatus.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/ApproximationStatus.yaml
new file mode 100644
index 0000000000..6eb967ad8b
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/classes/ApproximationStatus.yaml
@@ -0,0 +1,149 @@
+id: https://nde.nl/ontology/hc/class/ApproximationStatus
+name: approximation_status_class
+title: ApproximationStatus Class
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+ schema: http://schema.org/
+ crm: http://www.cidoc-crm.org/cidoc-crm/
+ rico: https://www.ica.org/standards/RiC/ontology#
+ skos: http://www.w3.org/2004/02/skos/core#
+imports:
+- linkml:types
+- ../metadata
+- ../slots/approximation_level
+- ../slots/has_or_had_label
+- ../slots/has_or_had_description
+- ./SpecificityAnnotation
+- ./TemplateSpecificityScores
+- ../slots/specificity_annotation
+- ../slots/template_specificity
+default_prefix: hc
+classes:
+ ApproximationStatus:
+ class_uri: hc:ApproximationStatus
+ description: >-
+ Status indicating the level of approximation or uncertainty for a value.
+
+ **PURPOSE**:
+
+ ApproximationStatus captures structured uncertainty information for values
+ like dates, quantities, and measurements where precision varies. This
+ replaces simple boolean "approximate: true/false" with richer modeling.
+
+ **UNCERTAINTY LEVELS**:
+
+ | Level | Label | Description | Example |
+ |-------|-------|-------------|---------|
+ | EXACT | Exact | Known with certainty | "1880-03-15" |
+ | APPROXIMATE | Approximate | Close but not exact | "circa 1880" |
+ | ESTIMATED | Estimated | Calculated/inferred | "estimated 1875-1885" |
+ | UNCERTAIN | Uncertain | Significant doubt | "possibly 19th century" |
+ | UNKNOWN | Unknown | Cannot be determined | "date unknown" |
+
+ **CIDOC-CRM ALIGNMENT**:
+
+ CIDOC-CRM models time-span precision through E52_Time-Span with fuzzy
+ boundaries. ApproximationStatus provides a complementary vocabulary for
+ expressing certainty levels.
+
+ **USE CASES**:
+
+ 1. **Date Uncertainty**: Founding dates known only to decade
+ 2. **Quantity Estimates**: Collection size approximations
+ 3. **Location Precision**: Address known only to city level
+ 4. **Historical Events**: Uncertain timing of organizational changes
+
+ **EXAMPLE**:
+
+ ```yaml
+ event_date: "1880"
+ is_or_was_approximate:
+ approximation_level: APPROXIMATE
+ has_or_had_label: "circa 1880"
+ has_or_had_description: "Founding date known only to year from secondary sources"
+ ```
+ exact_mappings:
+ - crm:E52_Time-Span
+ close_mappings:
+ - rico:DateType
+ related_mappings:
+ - skos:note
+ slots:
+ - approximation_level
+ - has_or_had_label
+ - has_or_had_description
+ - specificity_annotation
+ - template_specificity
+ slot_usage:
+ approximation_level:
+ range: ApproximationLevelEnum
+ required: true
+ description: >-
+ Level of approximation/uncertainty for the value.
+ has_or_had_label:
+ range: string
+ required: false
+ description: >-
+ Human-readable label for the approximation status.
+ examples:
+ - value: "circa 1880"
+ description: Approximate date label
+ - value: "approximately 10,000"
+ description: Approximate quantity label
+ has_or_had_description:
+ range: string
+ required: false
+ description: >-
+ Explanation of why the value is approximate and how uncertainty
+ was determined.
+ examples:
+ - value: "Founding date derived from secondary sources, exact day unknown"
+ description: Provenance of uncertainty
+ comments:
+ - ApproximationStatus replaces simple boolean approximate field
+ - Provides structured uncertainty modeling for dates, quantities, etc.
+ - Aligned with CIDOC-CRM E52_Time-Span precision concepts
+ - Used by is_or_was_approximate slot
+ see_also:
+ - https://www.cidoc-crm.org/Entity/e52-time-span/version-7.1.3
+ examples:
+ - value:
+ approximation_level: EXACT
+ has_or_had_label: "1880-03-15"
+ description: Exact date with full precision
+ - value:
+ approximation_level: APPROXIMATE
+ has_or_had_label: "circa 1880"
+ has_or_had_description: "Founding date known only to year from newspaper accounts"
+ description: Approximate date with explanation
+ - value:
+ approximation_level: ESTIMATED
+ has_or_had_label: "estimated 1875-1885"
+ has_or_had_description: "Date range inferred from building construction records"
+ description: Estimated date range
+ - value:
+ approximation_level: UNKNOWN
+ has_or_had_label: "date unknown"
+ has_or_had_description: "No founding records survive"
+ description: Unknown date
+ annotations:
+ specificity_score: 0.30
+ specificity_rationale: >-
+ Approximation status is broadly useful across contexts where
+ uncertainty needs to be expressed.
+
+enums:
+ ApproximationLevelEnum:
+ description: Levels of approximation/uncertainty for values.
+ permissible_values:
+ EXACT:
+ description: Value is known with certainty
+ APPROXIMATE:
+ description: Value is close but not exact (circa, roughly)
+ ESTIMATED:
+ description: Value is calculated or inferred
+ UNCERTAIN:
+ description: Significant doubt about accuracy
+ UNKNOWN:
+ description: Value cannot be determined
diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Asserter.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Asserter.yaml
new file mode 100644
index 0000000000..f2b14cc760
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/classes/Asserter.yaml
@@ -0,0 +1,180 @@
+id: https://nde.nl/ontology/hc/class/Asserter
+name: Asserter
+title: Asserter Class
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+ prov: http://www.w3.org/ns/prov#
+ foaf: http://xmlns.com/foaf/0.1/
+ schema: http://schema.org/
+ dcterms: http://purl.org/dc/terms/
+imports:
+- linkml:types
+- ../enums/AsserterTypeEnum
+- ../slots/has_or_had_identifier
+- ../slots/has_or_had_label
+- ../slots/has_or_had_description
+- ../slots/specificity_annotation
+- ../slots/template_specificity
+- ./SpecificityAnnotation
+- ./TemplateSpecificityScores
+default_prefix: hc
+classes:
+ Asserter:
+ class_uri: prov:Agent
+ description: >-
+ An agent (person, organization, or system) responsible for making
+ an assertion about a heritage entity.
+
+ **PROV-O ALIGNMENT**:
+
+ Maps to `prov:Agent` - "An agent is something that bears some form
+ of responsibility for an activity taking place, for the existence
+ of an entity, or for another agent's activity."
+
+ **TYPES OF ASSERTERS**:
+
+ | Type | Description | Example |
+ |------|-------------|---------|
+ | HUMAN_ANALYST | Expert making judgment | "jane.doe@nde.nl" |
+ | AUTOMATED_SYSTEM | Software system | "primary-presence-classifier/1.0" |
+ | AI_AGENT | AI/ML model | "claude-opus-4", "opencode-claude-sonnet-4" |
+ | ORGANIZATION | Institution | "Noord-Hollands Archief" |
+
+ **USE CASES**:
+
+ 1. **Attribution Tracking**: Who made this assertion about primary presence?
+ 2. **Provenance Chain**: Trace assertions back to their source agent.
+ 3. **Quality Assessment**: Different asserters may have different reliability.
+ 4. **Accountability**: Identify responsible party for each assertion.
+
+ **EXAMPLE**:
+
+ ```yaml
+ Asserter:
+ asserter_id: https://nde.nl/ontology/hc/asserter/claude-opus-4
+ asserter_name: Claude Opus 4
+ asserter_type: AI_AGENT
+ asserter_description: Anthropic Claude AI model used for assertion generation
+ asserter_version: "claude-opus-4-20250514"
+ ```
+ exact_mappings:
+ - prov:Agent
+ close_mappings:
+ - foaf:Agent
+ - dcterms:Agent
+ related_mappings:
+ - schema:Person
+ - schema:Organization
+ slots:
+ - has_or_had_identifier
+ - has_or_had_label
+ - has_or_had_description
+ - asserter_type
+ - asserter_version
+ - asserter_contact
+ - specificity_annotation
+ - template_specificity
+ slot_usage:
+ has_or_had_identifier:
+ range: uriorcurie
+ required: true
+ identifier: true
+ description: >-
+ Unique identifier for this asserter.
+ examples:
+ - value: https://nde.nl/ontology/hc/asserter/claude-opus-4
+ description: AI agent asserter
+ - value: https://nde.nl/ontology/hc/asserter/jane-doe-nde
+ description: Human analyst asserter
+ has_or_had_label:
+ range: string
+ required: true
+ description: >-
+ Name of the asserter.
+ examples:
+ - value: Claude Opus 4
+ description: AI model name
+ - value: Dr. Jane Doe
+ description: Human analyst name
+ - value: primary-presence-classifier
+ description: Automated system name
+ has_or_had_description:
+ range: string
+ required: false
+ description: >-
+ Description of the asserter and their role in the assertion process.
+ examples:
+ - value: Anthropic Claude AI model used for heritage data assertions
+ - value: Senior digital heritage analyst at NDE
+ asserter_type:
+ range: AsserterTypeEnum
+ required: true
+ description: >-
+ The type of agent making the assertion.
+ examples:
+ - value: AI_AGENT
+ - value: HUMAN_ANALYST
+ - value: AUTOMATED_SYSTEM
+ asserter_version:
+ range: string
+ required: false
+ description: >-
+ Version identifier for software agents.
+ examples:
+ - value: "claude-opus-4-20250514"
+ - value: "1.2.3"
+ asserter_contact:
+ range: string
+ required: false
+ description: >-
+ Contact information for human or organizational asserters.
+ examples:
+ - value: jane.doe@nde.nl
+ - value: heritage-team@museum.nl
+ comments:
+ - Asserter models the agent responsible for making assertions
+ - Supports tracking of human, automated, and AI-based assertions
+ - Uses PROV-O Agent as primary ontology mapping
+ - Version tracking particularly important for AI/ML agents
+ see_also:
+ - https://www.w3.org/TR/prov-o/#Agent
+ - https://xmlns.com/foaf/spec/#term_Agent
+ examples:
+ - value:
+ has_or_had_identifier: https://nde.nl/ontology/hc/asserter/claude-opus-4
+ has_or_had_label: Claude Opus 4
+ asserter_type: AI_AGENT
+ has_or_had_description: Anthropic Claude AI model used for heritage data assertions
+ asserter_version: "claude-opus-4-20250514"
+ description: AI agent asserter
+ - value:
+ has_or_had_identifier: https://nde.nl/ontology/hc/asserter/jane-doe-nde
+ has_or_had_label: Dr. Jane Doe
+ asserter_type: HUMAN_ANALYST
+ has_or_had_description: Senior digital heritage analyst at NDE
+ asserter_contact: jane.doe@nde.nl
+ description: Human analyst asserter
+ - value:
+ has_or_had_identifier: https://nde.nl/ontology/hc/asserter/primary-presence-classifier
+ has_or_had_label: primary-presence-classifier
+ asserter_type: AUTOMATED_SYSTEM
+ has_or_had_description: Automated system for classifying primary digital presence
+ asserter_version: "1.0.0"
+ description: Automated system asserter
+slots:
+ asserter_type:
+ description: >-
+ The type of agent making the assertion (human, automated, AI, organization).
+ range: AsserterTypeEnum
+ slot_uri: hc:asserterType
+ asserter_version:
+ description: >-
+ Version identifier for software agents (automated systems or AI).
+ range: string
+ slot_uri: hc:asserterVersion
+ asserter_contact:
+ description: >-
+ Contact information for human or organizational asserters.
+ range: string
+ slot_uri: hc:asserterContact
diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Author.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Author.yaml
new file mode 100644
index 0000000000..6bf58f009c
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/classes/Author.yaml
@@ -0,0 +1,199 @@
+id: https://nde.nl/ontology/hc/class/Author
+name: author_class
+title: Author Class
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+ schema: http://schema.org/
+ dcterms: http://purl.org/dc/terms/
+ bf: http://id.loc.gov/ontologies/bibframe/
+ bibo: http://purl.org/ontology/bibo/
+ foaf: http://xmlns.com/foaf/0.1/
+ rico: https://www.ica.org/standards/RiC/ontology#
+imports:
+- linkml:types
+- ../metadata
+- ../slots/has_or_had_label
+- ../slots/has_or_had_description
+- ../slots/has_or_had_identifier
+- ./SpecificityAnnotation
+- ./TemplateSpecificityScores
+- ../slots/specificity_annotation
+- ../slots/template_specificity
+default_prefix: hc
+classes:
+ Author:
+ class_uri: schema:Person
+ description: >-
+ Person or organization that authored/created a creative work.
+
+ **PURPOSE**:
+
+ Author models the creator(s) of works produced by heritage custodians,
+ such as exhibition catalogs, research publications, finding aids, and
+ reports. Replaces simple string author lists with structured data.
+
+ **ONTOLOGY ALIGNMENT**:
+
+ | Ontology | Class/Property | Usage |
+ |----------|----------------|-------|
+ | **Schema.org** | `schema:Person`, `schema:author` | Primary class and property |
+ | **Dublin Core** | `dcterms:creator` | Creator relationship |
+ | **BIBFRAME** | `bf:Contribution`, `bf:Agent` | Bibliographic contributions |
+ | **FOAF** | `foaf:Person`, `foaf:name` | Personal information |
+ | **RiC-O** | `rico:Agent` | Archival agent modeling |
+
+ **AUTHOR TYPES**:
+
+ Authors may be:
+ - **Individual persons**: Named authors with affiliations
+ - **Organizations**: Corporate authors (e.g., "Rijksmuseum Staff")
+ - **Anonymous**: Works with unknown authorship
+ - **Collective**: Group authorships
+
+ **ROLES**:
+
+ Beyond simple "author", works may have multiple contributor types:
+ - Author (primary creator)
+ - Editor
+ - Compiler
+ - Translator
+ - Illustrator
+ - Contributor
+
+ **EXAMPLE**:
+
+ ```yaml
+ has_or_had_author:
+ - author_name: "Jan de Vries"
+ author_role: AUTHOR
+ author_affiliation: "Rijksmuseum Amsterdam"
+ - author_name: "Maria van Dijk"
+ author_role: EDITOR
+ ```
+ exact_mappings:
+ - schema:Person
+ - foaf:Person
+ close_mappings:
+ - bf:Agent
+ - rico:Agent
+ related_mappings:
+ - bf:Contribution
+ - dcterms:creator
+ slots:
+ - author_name
+ - author_role
+ - author_affiliation
+ - author_identifier
+ - has_or_had_identifier
+ - has_or_had_label
+ - has_or_had_description
+ - specificity_annotation
+ - template_specificity
+ slot_usage:
+ author_name:
+ range: string
+ required: true
+ description: >-
+ Full name of the author (person or organization).
+ examples:
+ - value: "Jan de Vries"
+ description: Individual author
+ - value: "Rijksmuseum Research Department"
+ description: Corporate author
+ author_role:
+ range: AuthorRoleEnum
+ required: false
+ ifabsent: "string(AUTHOR)"
+ description: >-
+ Role of this person in creating the work.
+ examples:
+ - value: AUTHOR
+ description: Primary author
+ - value: EDITOR
+ description: Editor
+ author_affiliation:
+ range: string
+ required: false
+ description: >-
+ Organization the author is affiliated with.
+ examples:
+ - value: "Rijksmuseum Amsterdam"
+ description: Museum affiliation
+ - value: "Universiteit van Amsterdam"
+ description: University affiliation
+ author_identifier:
+ range: uriorcurie
+ required: false
+ description: >-
+ Identifier for the author (ORCID, VIAF, etc.).
+ examples:
+ - value: "https://orcid.org/0000-0001-2345-6789"
+ description: ORCID identifier
+ - value: "https://viaf.org/viaf/12345678"
+ description: VIAF identifier
+ comments:
+ - Author replaces simple string author lists with structured data
+ - Supports both individual and organizational authors
+ - Includes roles (author, editor, compiler, etc.)
+ - Can link to identifier systems (ORCID, VIAF)
+ see_also:
+ - https://schema.org/author
+ - https://schema.org/Person
+ - http://id.loc.gov/ontologies/bibframe/Contribution
+ examples:
+ - value:
+ author_name: "Jan de Vries"
+ author_role: AUTHOR
+ author_affiliation: "Rijksmuseum Amsterdam"
+ author_identifier: "https://orcid.org/0000-0001-2345-6789"
+ description: Individual author with full metadata
+ - value:
+ author_name: "Maria van Dijk"
+ author_role: EDITOR
+ description: Editor with minimal metadata
+ - value:
+ author_name: "Rijksmuseum Research Department"
+ author_role: AUTHOR
+ description: Corporate author
+ annotations:
+ specificity_score: 0.35
+ specificity_rationale: >-
+ Authorship is broadly useful for creative/documentary works.
+
+slots:
+ author_name:
+ description: Full name of the author (person or organization).
+ range: string
+ slot_uri: schema:name
+ author_role:
+ description: Role of this person in creating the work.
+ range: string
+ slot_uri: hc:authorRole
+ author_affiliation:
+ description: Organization the author is affiliated with.
+ range: string
+ slot_uri: schema:affiliation
+ author_identifier:
+ description: Identifier for the author (ORCID, VIAF, etc.).
+ range: uriorcurie
+ slot_uri: schema:identifier
+
+enums:
+ AuthorRoleEnum:
+ description: Roles for contributors to a creative work.
+ permissible_values:
+ AUTHOR:
+ description: Primary creator of the work
+ EDITOR:
+ description: Person who edited the work
+ COMPILER:
+ description: Person who compiled/assembled the work
+ TRANSLATOR:
+ description: Person who translated the work
+ ILLUSTRATOR:
+ description: Person who created illustrations
+ CONTRIBUTOR:
+ description: General contributor
+ PHOTOGRAPHER:
+ description: Person who created photographs
diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/BirthDate.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/BirthDate.yaml
new file mode 100644
index 0000000000..e9976f502e
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/classes/BirthDate.yaml
@@ -0,0 +1,217 @@
+id: https://nde.nl/ontology/hc/class/BirthDate
+name: birth_date_class
+title: Birth Date Class
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+ schema: http://schema.org/
+ crm: http://www.cidoc-crm.org/cidoc-crm/
+ time: http://www.w3.org/2006/time#
+ pico: https://personsincontext.org/model#
+ dcterms: http://purl.org/dc/terms/
+ xsd: http://www.w3.org/2001/XMLSchema#
+imports:
+ - linkml:types
+ - ../metadata
+ - ../slots/specificity_annotation
+ - ../slots/template_specificity
+ - ./SpecificityAnnotation
+ - ./TemplateSpecificityScores
+default_prefix: hc
+classes:
+ BirthDate:
+ class_uri: schema:Date
+ description: >-
+ Structured representation of a person's birth date with support for
+ uncertainty, incomplete dates, and provenance tracking.
+
+ **PURPOSE**:
+
+ BirthDate replaces simple string birth_date slots to provide:
+ - EDTF (Extended Date/Time Format) support for uncertain/incomplete dates
+ - Provenance tracking for inferred dates (Rule 45)
+ - Confidence scoring
+ - Source preservation (original format from documents)
+
+ **EDTF NOTATION** (Rule 44):
+
+ | Pattern | Meaning | Example |
+ |---------|---------|---------|
+ | `YYYY` | Year only | `1970` |
+ | `YYYY-MM` | Year and month | `1970-08` |
+ | `YYYY-MM-DD` | Full date | `1970-08-15` |
+ | `YYYX` | Decade | `197X` (1970s) |
+ | `YYXX` | Century | `19XX` (1900s) |
+ | `YYYY~` | Approximate | `1985~` (circa 1985) |
+ | `YYYY?` | Uncertain | `1985?` (possibly 1985) |
+ | `XXXX` | Unknown | Must have search provenance |
+
+ **INFERRED DATA** (Rule 45):
+
+ When birth date is inferred (e.g., from earliest education date):
+ - Store in `inferred_birth_date` with full inference chain
+ - Set `is_inferred: true`
+ - Document inference method and sources
+
+ **ONTOLOGY ALIGNMENT**:
+
+ | Ontology | Mapping | Usage |
+ |----------|---------|-------|
+ | **Schema.org** | `schema:Date` | Primary class |
+ | **CIDOC-CRM** | `crm:E52_Time-Span` | Temporal extent |
+ | **PiCo** | Birth date observation | Source fidelity |
+ | **TIME** | `time:Instant` | Point in time |
+
+ **EXAMPLE**:
+
+ ```yaml
+ has_or_had_date_of_birth:
+ birth_edtf: "1970-08-15"
+ birth_iso_date: "1970-08-15"
+ is_inferred: false
+ confidence: high
+ ```
+ exact_mappings:
+ - schema:Date
+ close_mappings:
+ - crm:E52_Time-Span
+ - time:Instant
+ related_mappings:
+ - pico:PersonObservation
+ slots:
+ - birth_edtf
+ - birth_iso_date
+ - birth_source_text
+ - is_inferred
+ - inference_provenance
+ - confidence
+ - specificity_annotation
+ - template_specificity
+ slot_usage:
+ birth_edtf:
+ range: string
+ required: true
+ description: >-
+ Birth date in EDTF notation (Extended Date/Time Format).
+ Supports incomplete dates, uncertainty, and approximation.
+ examples:
+ - value: "1970-08-15"
+ description: Full date known
+ - value: "1970-08"
+ description: Year and month known
+ - value: "1970"
+ description: Only year known
+ - value: "197X"
+ description: Decade known (1970s)
+ - value: "1970~"
+ description: Approximate (circa 1970)
+ - value: "XXXX"
+ description: Unknown (requires search provenance)
+ birth_iso_date:
+ range: date
+ required: false
+ description: >-
+ Birth date as ISO 8601 date (YYYY-MM-DD) when full date is known.
+ Optional - use birth_edtf for partial/uncertain dates.
+ examples:
+ - value: "1970-08-15"
+ birth_source_text:
+ range: string
+ required: false
+ description: >-
+ Original date text from source document, preserved verbatim.
+ Useful for archival/historical sources with non-standard notation.
+ examples:
+ - value: "born in the year of our Lord 1823"
+ - value: "ca. 1750"
+ - value: "late 18th century"
+ is_inferred:
+ range: boolean
+ required: false
+ ifabsent: "false"
+ description: >-
+ Whether this birth date was inferred (vs. directly extracted).
+ If true, inference_provenance MUST be provided per Rule 45.
+ inference_provenance:
+ range: string
+ required: false
+ description: >-
+ JSON string documenting inference chain per Rule 45.
+ Required when is_inferred is true.
+ examples:
+ - value: '{"method": "earliest_education_heuristic", "inference_chain": [...]}'
+ confidence:
+ range: BirthDateConfidenceEnum
+ required: false
+ description: >-
+ Confidence level in the birth date value.
+ comments:
+ - "Replaces simple birth_date string slot (Rule 53)"
+ - "EDTF notation enables uncertain/incomplete date representation"
+ - "Inference provenance required when is_inferred=true (Rule 45)"
+ - "Source text preservation supports archival/historical research"
+ see_also:
+ - https://www.loc.gov/standards/datetime/
+ - https://schema.org/birthDate
+ examples:
+ - value:
+ birth_edtf: "1970-08-15"
+ birth_iso_date: "1970-08-15"
+ is_inferred: false
+ confidence: HIGH
+ description: Full date known with high confidence
+ - value:
+ birth_edtf: "197X"
+ is_inferred: true
+ inference_provenance: '{"method": "earliest_education_heuristic", "source_field": "education[0].start_year"}'
+ confidence: LOW
+ description: Decade inferred from education start year
+ - value:
+ birth_edtf: "1823"
+ birth_source_text: "born in the year of our Lord 1823"
+ is_inferred: false
+ confidence: MEDIUM
+ description: Year extracted from historical document
+ annotations:
+ specificity_score: 0.45
+ specificity_rationale: >-
+ Birth dates are relevant for person research across all heritage sectors.
+
+slots:
+ birth_edtf:
+ description: Birth date in EDTF notation.
+ range: string
+ slot_uri: dcterms:date
+ birth_iso_date:
+ description: Birth date as ISO 8601 date when full date is known.
+ range: date
+ slot_uri: schema:birthDate
+ birth_source_text:
+ description: Original date text from source document.
+ range: string
+ slot_uri: hc:sourceText
+ is_inferred:
+ description: Whether this date was inferred.
+ range: boolean
+ slot_uri: hc:isInferred
+ inference_provenance:
+ description: JSON documenting inference chain.
+ range: string
+ slot_uri: hc:inferenceProvenance
+ confidence:
+ description: Confidence level in the date value.
+ range: string
+ slot_uri: hc:confidence
+
+enums:
+ BirthDateConfidenceEnum:
+ description: Confidence levels for birth date values.
+ permissible_values:
+ HIGH:
+ description: Full date from authoritative source (e.g., birth certificate)
+ MEDIUM:
+ description: Date from reliable source (e.g., official biography)
+ LOW:
+ description: Date inferred or from uncertain source
+ VERY_LOW:
+ description: Decade/century estimated from indirect evidence
diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/BirthPlace.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/BirthPlace.yaml
new file mode 100644
index 0000000000..b590688859
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/classes/BirthPlace.yaml
@@ -0,0 +1,223 @@
+id: https://nde.nl/ontology/hc/class/BirthPlace
+name: birth_place_class
+title: Birth Place Class
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+ schema: http://schema.org/
+ crm: http://www.cidoc-crm.org/cidoc-crm/
+ gn: http://www.geonames.org/ontology#
+ wdt: http://www.wikidata.org/prop/direct/
+imports:
+ - linkml:types
+ - ../metadata
+ - ../slots/specificity_annotation
+ - ../slots/template_specificity
+ - ./SpecificityAnnotation
+ - ./TemplateSpecificityScores
+default_prefix: hc
+classes:
+ BirthPlace:
+ class_uri: schema:Place
+ description: >-
+ Structured representation of a person's place of birth with support
+ for historical place names, modern equivalents, and geographic identifiers.
+
+ **PURPOSE**:
+
+ BirthPlace replaces simple string birth_place slots to provide:
+ - Historical place name preservation
+ - Modern place name linkage
+ - Geographic identifier integration (GeoNames, Wikidata)
+ - Coordinate storage for mapping applications
+
+ **HISTORICAL VS. MODERN NAMES**:
+
+ Many birth places used historical names that have since changed:
+ - "Batavia" → "Jakarta"
+ - "Bombay" → "Mumbai"
+ - "Leningrad" → "St. Petersburg"
+ - "Saigon" → "Ho Chi Minh City"
+
+ BirthPlace preserves the source name while linking to modern identifiers.
+
+ **GEOGRAPHIC RESOLUTION**:
+
+ Per AGENTS.md Rule on GeoNames as authoritative source:
+ - `geonames_id`: Links to GeoNames for standardization
+ - `wikidata_id`: Links to Wikidata for additional context
+ - `coordinates`: Lat/lon for mapping
+
+ **ONTOLOGY ALIGNMENT**:
+
+ | Ontology | Mapping | Usage |
+ |----------|---------|-------|
+ | **Schema.org** | `schema:Place` | Primary class |
+ | **CIDOC-CRM** | `crm:E53_Place` | Place entity |
+ | **GeoNames** | `gn:Feature` | Geographic feature |
+
+ **EXAMPLE**:
+
+ ```yaml
+ has_or_had_place_of_birth:
+ place_name: "Batavia"
+ modern_place_name: "Jakarta"
+ country_code: "ID"
+ geonames_id: 1642911
+ wikidata_id: "Q3630"
+ ```
+ exact_mappings:
+ - schema:Place
+ close_mappings:
+ - crm:E53_Place
+ - gn:Feature
+ slots:
+ - place_name
+ - modern_place_name
+ - country_code
+ - region_code
+ - geonames_id
+ - wikidata_id
+ - coordinates
+ - place_source_text
+ - specificity_annotation
+ - template_specificity
+ slot_usage:
+ place_name:
+ range: string
+ required: true
+ description: >-
+ Name of the birth place as recorded in source.
+ May be historical name that has since changed.
+ examples:
+ - value: "Amsterdam"
+ description: Current name
+ - value: "Batavia"
+ description: Historical name (now Jakarta)
+ modern_place_name:
+ range: string
+ required: false
+ description: >-
+ Modern equivalent name if place_name is historical.
+ Leave null if place_name is current.
+ examples:
+ - value: "Jakarta"
+ description: Modern name for Batavia
+ country_code:
+ range: string
+ required: false
+ pattern: "^[A-Z]{2}$"
+ description: >-
+ ISO 3166-1 alpha-2 country code.
+ examples:
+ - value: "NL"
+ - value: "ID"
+ region_code:
+ range: string
+ required: false
+ description: >-
+ ISO 3166-2 region/province code or GeoNames admin1 code.
+ examples:
+ - value: "NH"
+ description: Noord-Holland
+ geonames_id:
+ range: integer
+ required: false
+ description: >-
+ GeoNames geographic identifier for the place.
+ Authoritative source per AGENTS.md.
+ examples:
+ - value: 2759794
+ description: Amsterdam GeoNames ID
+ wikidata_id:
+ range: string
+ required: false
+ pattern: "^Q[0-9]+$"
+ description: >-
+ Wikidata entity identifier for the place.
+ examples:
+ - value: "Q727"
+ description: Amsterdam Wikidata ID
+ coordinates:
+ range: string
+ required: false
+ description: >-
+ Geographic coordinates as "lat,lon" string.
+ examples:
+ - value: "52.3676,4.9041"
+ description: Amsterdam coordinates
+ place_source_text:
+ range: string
+ required: false
+ description: >-
+ Original place text from source document, preserved verbatim.
+ Useful when source contains additional context.
+ examples:
+ - value: "born at the family estate in rural Gelderland"
+ comments:
+ - "Replaces simple birth_place string slot (Rule 53)"
+ - "Preserves historical place names while linking to modern identifiers"
+ - "GeoNames ID is authoritative per AGENTS.md"
+ see_also:
+ - https://schema.org/birthPlace
+ - https://www.geonames.org/
+ examples:
+ - value:
+ place_name: "Amsterdam"
+ country_code: "NL"
+ region_code: "NH"
+ geonames_id: 2759794
+ wikidata_id: "Q727"
+ coordinates: "52.3676,4.9041"
+ description: Birth place with full geographic resolution
+ - value:
+ place_name: "Batavia"
+ modern_place_name: "Jakarta"
+ country_code: "ID"
+ geonames_id: 1642911
+ wikidata_id: "Q3630"
+ description: Historical place name with modern equivalent
+ - value:
+ place_name: "rural Gelderland"
+ country_code: "NL"
+ region_code: "GE"
+ place_source_text: "born at the family estate in rural Gelderland"
+ description: Imprecise location from archival source
+ annotations:
+ specificity_score: 0.45
+ specificity_rationale: >-
+ Birth places are relevant for person research across heritage sectors.
+
+slots:
+ place_name:
+ description: Name of the place as recorded in source.
+ range: string
+ slot_uri: schema:name
+ modern_place_name:
+ description: Modern equivalent name if different from source name.
+ range: string
+ slot_uri: hc:modernPlaceName
+ country_code:
+ description: ISO 3166-1 alpha-2 country code.
+ range: string
+ slot_uri: schema:addressCountry
+ region_code:
+ description: ISO 3166-2 region/province code.
+ range: string
+ slot_uri: schema:addressRegion
+ geonames_id:
+ description: GeoNames geographic identifier.
+ range: integer
+ slot_uri: gn:geonamesId
+ wikidata_id:
+ description: Wikidata entity identifier.
+ range: string
+ slot_uri: wdt:P625
+ coordinates:
+ description: Geographic coordinates as lat,lon string.
+ range: string
+ slot_uri: schema:geo
+ place_source_text:
+ description: Original place text from source document.
+ range: string
+ slot_uri: hc:sourceText
diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/BranchOffice.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/BranchOffice.yaml
index 513c70d542..b4267407df 100644
--- a/frontend/public/schemas/20251121/linkml/modules/classes/BranchOffice.yaml
+++ b/frontend/public/schemas/20251121/linkml/modules/classes/BranchOffice.yaml
@@ -9,8 +9,15 @@ imports:
- ../slots/has_or_had_description
- ../slots/has_or_had_identifier
- ../slots/has_or_had_label
-- ../slots/branch_service_area
-- ../slots/branch_staff_count
+# REMOVED - migrated to has_or_had_service_area (Rule 53)
+# - ../slots/branch_service_area
+- ../slots/has_or_had_service_area
+- ./ServiceArea
+# REMOVED - migrated to has_or_had_quantity (Rule 53)
+# - ../slots/branch_staff_count
+- ../slots/has_or_had_quantity
+- ./Quantity
+- ../enums/QuantityTypeEnum
- ../slots/has_local_collection
- ../slots/is_public_facing
- ../slots/operating_hour
@@ -69,8 +76,12 @@ classes:
- has_or_had_description
- has_or_had_identifier
- has_or_had_label
- - branch_service_area
- - branch_staff_count
+ # REMOVED - migrated to has_or_had_service_area (Rule 53)
+ # - branch_service_area
+ - has_or_had_service_area
+ # REMOVED - migrated to has_or_had_quantity (Rule 53)
+ # - branch_staff_count
+ - has_or_had_quantity
- has_local_collection
- is_public_facing
- operating_hour
@@ -115,13 +126,27 @@ classes:
- value: Regional branch serving Zaanstreek-Waterland area. Holds municipal records from Zaandam, Wormerland, Purmerend.
Open to researchers Tuesday-Thursday.
description: Archive branch description
- branch_service_area:
- range: string
+ # REMOVED - migrated to has_or_had_service_area (Rule 53)
+ # branch_service_area:
+ # range: string
+ # examples:
+ # - value: Zaanstreek-Waterland region
+ # description: Regional coverage
+ # - value: Amsterdam Schiphol Airport travelers
+ # description: Specific community served
+ has_or_had_service_area:
+ range: ServiceArea
+ inlined: true
+ description: >-
+ Geographic area or community served by this branch.
+ MIGRATED from branch_service_area (Rule 53) - changed from string to
+ ServiceArea class for richer geographic modeling.
examples:
- - value: Zaanstreek-Waterland region
- description: Regional coverage
- - value: Amsterdam Schiphol Airport travelers
- description: Specific community served
+ - value:
+ service_area_id: https://nde.nl/ontology/hc/servicearea/zaanstreek-waterland
+ service_area_name: Zaanstreek-Waterland region
+ service_area_type: REGIONAL
+ description: Regional coverage as structured ServiceArea
is_public_facing:
range: boolean
required: true
@@ -144,11 +169,28 @@ classes:
examples:
- value: Tu-Th 09:00-17:00
description: Limited weekday hours
- branch_staff_count:
- range: integer
+ # REMOVED - migrated to has_or_had_quantity (Rule 53)
+ # branch_staff_count:
+ # range: integer
+ # examples:
+ # - value: 3
+ # description: Small branch staff
+ has_or_had_quantity:
+ range: Quantity
+ inlined: true
+ description: >-
+ Quantified values associated with this branch office (e.g., staff count).
+ MIGRATED from branch_staff_count (Rule 53) - changed from integer to
+ Quantity class for richer measurement context (units, dates, estimates).
examples:
- - value: 3
- description: Small branch staff
+ - value:
+ quantity_value: 3
+ quantity_type: STAFF_COUNT
+ quantity_unit: FTE
+ has_or_had_description: Staff assigned to this branch
+ quantity_date: '2025-01-01'
+ is_estimate: false
+ description: Branch staff count as structured Quantity
has_local_collection:
range: boolean
examples:
@@ -177,14 +219,21 @@ classes:
has_or_had_label: Noord-Hollands Archief - Zaanstreek-Waterland
has_or_had_description: Regional branch serving Zaanstreek-Waterland area. Holds municipal records from Zaandam,
Wormerland, Purmerend.
- branch_service_area: Zaanstreek-Waterland region
+ has_or_had_service_area:
+ service_area_id: https://nde.nl/ontology/hc/servicearea/zaanstreek-waterland
+ service_area_name: Zaanstreek-Waterland region
+ service_area_type: REGIONAL
is_public_facing: true
services_offered:
- Archival research access
- Genealogical consultations
- Local history reference
operating_hours: Tu-Th 09:00-17:00
- branch_staff_count: 3
+ has_or_had_quantity:
+ quantity_value: 3
+ quantity_type: STAFF_COUNT
+ quantity_unit: FTE
+ has_or_had_description: Staff assigned to Zaanstreek-Waterland branch
has_local_collection: true
description: Regional archive branch
- value:
@@ -192,12 +241,19 @@ classes:
has_or_had_label: Rijksmuseum Schiphol
has_or_had_description: Exhibition space at Schiphol Airport featuring rotating highlights from the Rijksmuseum
collection. Free admission.
- branch_service_area: Amsterdam Schiphol Airport travelers
+ has_or_had_service_area:
+ service_area_id: https://nde.nl/ontology/hc/servicearea/schiphol-travelers
+ service_area_name: Amsterdam Schiphol Airport travelers
+ service_area_type: COMMUNITY
is_public_facing: true
services_offered:
- Exhibition viewing
- Museum shop
operating_hours: Daily 07:00-20:00
- branch_staff_count: 5
+ has_or_had_quantity:
+ quantity_value: 5
+ quantity_type: STAFF_COUNT
+ quantity_unit: FTE
+ has_or_had_description: Staff assigned to Schiphol branch
has_local_collection: false
description: Museum airport branch
diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Budget.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Budget.yaml
index 68e29d853b..b4d6c14339 100644
--- a/frontend/public/schemas/20251121/linkml/modules/classes/Budget.yaml
+++ b/frontend/public/schemas/20251121/linkml/modules/classes/Budget.yaml
@@ -250,9 +250,12 @@ classes:
has_approval_date:
range: date
required: false
- is_or_was_is_or_was_approved_by: # MIGRATED: was was_approved_by (2026-01-15)
- description: Agent (person/organization) that approved this budget
- range: string
+ is_or_was_approved_by:
+ description: >-
+ Agent (person/organization) that approved this budget.
+ MIGRATED from approved_by (2026-01-15) per Rule 39.
+ Range changed from string to Approver class for structured approval tracking.
+ range: Approver
required: false
# MIGRATED from budget_status to has_or_had_status (Rule 53)
# budget_status:
@@ -336,7 +339,8 @@ classes:
internal_funding: 25000000.0
endowment_draw: 5000000.0
approval_date: '2023-11-15'
- is_or_was_approved_by: Board of Directors
+ is_or_was_approved_by:
+ approver_name: Board of Directors
has_or_had_status:
value: ACTIVE
effective_date: '2024-01-01'
@@ -360,7 +364,8 @@ classes:
external_funding: 6000000.0
internal_funding: 2500000.0
approval_date: '2024-03-01'
- is_or_was_approved_by: Province of Noord-Holland
+ is_or_was_approved_by:
+ approver_name: Province of Noord-Holland
has_or_had_status:
value: ACTIVE
effective_date: '2024-04-01'
diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/CustodianPlace.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/CustodianPlace.yaml
index b27255adc1..f4bb936ecc 100644
--- a/frontend/public/schemas/20251121/linkml/modules/classes/CustodianPlace.yaml
+++ b/frontend/public/schemas/20251121/linkml/modules/classes/CustodianPlace.yaml
@@ -14,7 +14,9 @@ imports:
- ./GeoSpatialPlace
- ../enums/PlaceSpecificityEnum
- ./ReconstructedEntity
-- ../slots/auxiliary_places
+# REMOVED - migrated to has_or_had_auxiliary_entities with range AuxiliaryPlace (Rule 53)
+# - ../slots/auxiliary_places
+- ../slots/has_or_had_auxiliary_entities
- ../slots/place_name
- ../slots/place_language
- ../slots/place_specificity
@@ -65,7 +67,9 @@ classes:
- prov:Entity
- crm:E27_Site
slots:
- - auxiliary_places
+ # MIGRATED from auxiliary_places to has_or_had_auxiliary_entities (Rule 53)
+ # - auxiliary_places
+ - has_or_had_auxiliary_entities
- country
- has_feature_type
- has_geospatial_location
@@ -171,7 +175,11 @@ classes:
has_accuracy_in_meters: 50.0
spatial_resolution: NEIGHBORHOOD
description: Approximate location from neighborhood reference
- has_auxiliary_place:
+ # MIGRATED from auxiliary_places / has_auxiliary_place (Rule 53)
+ has_or_had_auxiliary_entities:
+ description: |
+ MIGRATED from auxiliary_places (Rule 53).
+ Subordinate or auxiliary locations associated with this custodian place.
range: AuxiliaryPlace
multivalued: true
inlined_as_list: true
@@ -211,7 +219,7 @@ classes:
- Link to GeoSpatialPlace via has_geospatial_location slot (TOOI pattern)
- Can be vague ('the mansion') or specific ('het museum op het Museumplein 1')
- Historical place names capture how custodians were referenced in archival documents
- - 'NEW: auxiliary_places links to subordinate AuxiliaryPlace sites (depots, branches, labs)'
+ - 'MIGRATED: auxiliary_places → has_or_had_auxiliary_entities for AuxiliaryPlace sites (depots, branches, labs)'
- Hierarchical pattern mirrors CustodianName → CustodianAppellation relationship
see_also:
- http://www.cidoc-crm.org/html/cidoc_crm_v7.1.3.html#E53
diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/CustodianTimelineEvent.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/CustodianTimelineEvent.yaml
index f55fece8aa..db7db23d21 100644
--- a/frontend/public/schemas/20251121/linkml/modules/classes/CustodianTimelineEvent.yaml
+++ b/frontend/public/schemas/20251121/linkml/modules/classes/CustodianTimelineEvent.yaml
@@ -18,7 +18,10 @@ imports:
- ../enums/DataTierEnum
- ../enums/DatePrecisionEnum
- ../enums/TimelineExtractionMethodEnum
-- ../slots/approximate
+# REMOVED - migrated to is_or_was_approximate (Rule 53)
+# - ../slots/approximate
+- ../slots/is_or_was_approximate
+- ./ApproximationStatus
- ../slots/has_archive_path
- ../slots/data_tier
- ../slots/date_precision
@@ -53,8 +56,8 @@ classes:
\ Scope decrease (ingekrompen)\n- REORGANIZATION: Complex restructuring (herstructurering)\n\n**EXCLUDED EVENT TYPES**\n\
\nSome patterns are NOT mapped to events:\n- predecessor: This is a relationship, not an event\n- friends_org: Separate\
\ organization (Vrienden van...)\n- reopening: Not in OrganizationalChangeEventTypeEnum\n\n**EXAMPLE USAGE**\n\n```yaml\n\
- timeline_events:\n - event_type: FOUNDING\n event_date: \"2005-04-30\"\n date_precision: day\n approximate:\
- \ false\n description: >-\n Het RHC Drents Archief werd opgericht op 30 april 2005.\n Het is de voortzetting\
+ timeline_events:\n - event_type: FOUNDING\n event_date: \"2005-04-30\"\n date_precision: day\n is_or_was_approximate:\n\
+ \ approximation_level: EXACT\n description: >-\n Het RHC Drents Archief werd opgericht op 30 april 2005.\n Het is de voortzetting\
\ van het Rijksarchief in Drenthe (sinds 2000).\n source_url:\n - \"https://nl.wikipedia.org/wiki/Drents_Archief\"\
\n - \"https://bizzy.ai/nl/nl/52454037/regionaal-historisch-centrum-rhc-drents-archief\"\n extraction_method:\
\ api_response_regex\n extraction_timestamp: \"2025-12-16T10:00:00Z\"\n extraction_notes: >-\n Query: \"\
@@ -67,7 +70,9 @@ classes:
- tooi:Wijzigingsgebeurtenis
- schema:Event
slots:
- - approximate
+ # REMOVED - migrated to is_or_was_approximate (Rule 53)
+ # - approximate
+ - is_or_was_approximate
- archive_path
- data_tier
- date_precision
@@ -88,8 +93,26 @@ classes:
required: false
date_precision:
required: true
- is_approximate:
+ # REMOVED - migrated to is_or_was_approximate (Rule 53)
+ # is_approximate:
+ # required: true
+ is_or_was_approximate:
+ range: ApproximationStatus
+ inlined: true
required: true
+ description: >-
+ Whether the event date is approximate or uncertain.
+ MIGRATED from approximate (Rule 53) - changed from boolean to
+ ApproximationStatus class for structured uncertainty modeling.
+ examples:
+ - value:
+ approximation_level: EXACT
+ description: Exact date known
+ - value:
+ approximation_level: APPROXIMATE
+ has_or_had_label: "circa 1880"
+ has_or_had_description: "Founding date known only to year"
+ description: Approximate date with explanation
description:
required: true
source_url:
@@ -134,7 +157,8 @@ classes:
event_type: FOUNDING
event_date: '2005-04-30'
date_precision: day
- approximate: false
+ is_or_was_approximate:
+ approximation_level: EXACT
description: Het RHC Drents Archief werd opgericht op 30 april 2005.
source_url:
- https://nl.wikipedia.org/wiki/Drents_Archief
@@ -148,7 +172,8 @@ classes:
event_type: MERGER
event_date: '2005'
date_precision: year
- approximate: false
+ is_or_was_approximate:
+ approximation_level: EXACT
description: In 2005 ging het Gemeentearchief Assen op in het Drents Archief.
source_url:
- https://nl.wikipedia.org/wiki/Drents_Archief
@@ -160,7 +185,8 @@ classes:
event_type: FOUNDING
event_date: '1810'
date_precision: year
- approximate: false
+ is_or_was_approximate:
+ approximation_level: EXACT
description: The Rijksmuseum was founded in 1810 as the Royal Museum.
source_url:
- https://www.wikidata.org/wiki/Q190804
@@ -173,7 +199,8 @@ classes:
event_type: TRANSFER
event_date: '1885'
date_precision: year
- approximate: false
+ is_or_was_approximate:
+ approximation_level: EXACT
description: The Rijksmuseum moved to its current building designed by Cuypers.
source_url:
- https://www.rijksmuseum.nl/en/about-us/what-we-do/history
@@ -183,3 +210,16 @@ classes:
archive_path: web/0001/rijksmuseum.nl/about-us/rendered.html
data_tier: TIER_2_VERIFIED
description: Relocation event from institutional website
+ - value:
+ event_type: FOUNDING
+ event_date: '1880'
+ date_precision: year
+ is_or_was_approximate:
+ approximation_level: APPROXIMATE
+ has_or_had_label: "circa 1880"
+ has_or_had_description: "Founding date derived from secondary sources, exact year uncertain"
+ description: Museum founded around 1880, exact date unknown.
+ extraction_method: manual_research
+ extraction_timestamp: '2025-12-20T16:00:00Z'
+ data_tier: TIER_4_INFERRED
+ description: Founding event with approximate date
diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/DigitalPlatform.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/DigitalPlatform.yaml
index 8850d0db5c..c7b2065d34 100644
--- a/frontend/public/schemas/20251121/linkml/modules/classes/DigitalPlatform.yaml
+++ b/frontend/public/schemas/20251121/linkml/modules/classes/DigitalPlatform.yaml
@@ -16,7 +16,9 @@ imports:
- ./SearchAPI
- ./METSAPI
- ./DataServiceEndpointTypes
-- ../slots/auxiliary_platforms
+# REMOVED - migrated to has_or_had_auxiliary_entities with range AuxiliaryDigitalPlatform (Rule 53)
+# - ../slots/auxiliary_platforms
+- ../slots/has_or_had_auxiliary_entities
- ../slots/has_or_had_powered_by_cm
- ../slots/has_or_had_access_restriction
- ../slots/preservation_level
@@ -103,7 +105,9 @@ classes:
slots:
- has_or_had_access_restriction
- has_or_had_api_endpoint
- - auxiliary_platforms
+ # MIGRATED from auxiliary_platforms to has_or_had_auxiliary_entities (Rule 53)
+ # - auxiliary_platforms
+ - has_or_had_auxiliary_entities
- collection_web_address
- has_or_had_data_service_endpoint
- fixity_check_date
@@ -241,7 +245,11 @@ classes:
description: Open to all users
- value: API key required
description: Developer registration needed
- has_auxiliary_platform:
+ # MIGRATED from auxiliary_platforms / has_auxiliary_platform (Rule 53)
+ has_or_had_auxiliary_entities:
+ description: |
+ MIGRATED from auxiliary_platforms (Rule 53).
+ Subordinate or auxiliary digital platforms associated with this platform.
range: AuxiliaryDigitalPlatform
multivalued: true
inlined_as_list: true
@@ -326,7 +334,7 @@ classes:
- 'Multivalued on Custodian: one custodian can have multiple platforms (website + API + mobile app)'
- Temporal validity tracks platform lifecycle (launch, shutdown, migration)
- IIIF and linked data flags enable discovery of interoperable platforms
- - 'NEW: auxiliary_platforms links to subordinate AuxiliaryDigitalPlatform sites (project portals, microsites, APIs)'
+ - 'MIGRATED: auxiliary_platforms → has_or_had_auxiliary_entities for AuxiliaryDigitalPlatform sites (project portals, microsites, APIs)'
- Hierarchical pattern mirrors CustodianName → CustodianAppellation relationship
see_also:
- https://schema.org/WebSite
diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/ExhibitionCatalog.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/ExhibitionCatalog.yaml
index 5487267fc1..7a1865d5f3 100644
--- a/frontend/public/schemas/20251121/linkml/modules/classes/ExhibitionCatalog.yaml
+++ b/frontend/public/schemas/20251121/linkml/modules/classes/ExhibitionCatalog.yaml
@@ -20,7 +20,10 @@ imports:
- ../slots/isbn
- ../slots/language
- ../slots/price
-- ../slots/authors
+# REMOVED - migrated to has_or_had_author (Rule 53)
+# - ../slots/authors
+- ../slots/has_or_had_author
+- ./Author
# REMOVED: ../slots/binding - Use has_or_had_type with BindingType instead (2026-01-15)
- ../slots/has_or_had_type
- ./BindingType
@@ -51,7 +54,7 @@ imports:
- ../slots/worldcat_id
- ./SpecificityAnnotation
- ./TemplateSpecificityScores
-- ../slots/has_author
+# REMOVED: ../slots/has_author - migrated to has_or_had_author (Rule 53)
default_prefix: hc
classes:
ExhibitionCatalog:
@@ -80,7 +83,8 @@ classes:
- bf:Instance
- bibo:Book
slots:
- - authors
+ # REMOVED: authors - migrated to has_or_had_author (Rule 53)
+ - has_or_had_author
# REMOVED: binding - Use has_or_had_type with BindingType instead (2026-01-15)
- has_or_had_type
- catalog_description
@@ -146,13 +150,28 @@ classes:
examples:
- value: PRINT_CATALOG
- value: DIGITAL_CATALOG
- has_author:
+ has_or_had_author:
+ description: >-
+ Authors of the exhibition catalog.
+ MIGRATED from authors/has_author slots (Rule 53).
+
+ Uses Author class for structured authorship data including
+ name, role (author/editor/translator), affiliation, and identifiers.
required: false
- range: string
+ range: Author
+ inlined: true
multivalued: true
examples:
- - value: Pieter Roelofs
- - value: Gregor J.M. Weber
+ - value: |
+ author_name: Pieter Roelofs
+ author_role: AUTHOR
+ author_affiliation: Rijksmuseum Amsterdam
+ description: Primary author with affiliation
+ - value: |
+ author_name: Gregor J.M. Weber
+ author_role: AUTHOR
+ author_identifier: https://orcid.org/0000-0002-1234-5678
+ description: Author with ORCID identifier
editor:
required: false
range: string
@@ -340,9 +359,13 @@ classes:
catalog_title: Vermeer
catalog_for: https://nde.nl/ontology/hc/exhibition/rijksmuseum-vermeer-2023
catalog_type: PRINT_CATALOG
- has_author:
- - Pieter Roelofs
- - Gregor J.M. Weber
+ has_or_had_author:
+ - author_name: Pieter Roelofs
+ author_role: AUTHOR
+ author_affiliation: Rijksmuseum Amsterdam
+ - author_name: Gregor J.M. Weber
+ author_role: AUTHOR
+ author_affiliation: Rijksmuseum Amsterdam
editor:
- Pieter Roelofs
publisher: Rijksmuseum / Hannibal Publishing
diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/PersonObservation.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/PersonObservation.yaml
index c3653ba6b9..8c11d70506 100644
--- a/frontend/public/schemas/20251121/linkml/modules/classes/PersonObservation.yaml
+++ b/frontend/public/schemas/20251121/linkml/modules/classes/PersonObservation.yaml
@@ -17,8 +17,14 @@ imports:
- ../slots/id
- ../slots/person_name
- ../slots/has_person_name
-- ../slots/birth_date
-- ../slots/birth_place
+# REMOVED - migrated to has_or_had_date_of_birth (Rule 53)
+# - ../slots/birth_date
+- ../slots/has_or_had_date_of_birth
+- ./BirthDate
+# REMOVED - migrated to has_or_had_place_of_birth (Rule 53)
+# - ../slots/birth_place
+- ../slots/has_or_had_place_of_birth
+- ./BirthPlace
- ../slots/death_place
- ../slots/date_of_death
- ../slots/deceased
@@ -99,8 +105,10 @@ classes:
slots:
- is_or_was_affected_by_event
- has_age
- - birth_date
- - birth_place
+ # REMOVED: birth_date - migrated to has_or_had_date_of_birth (Rule 53)
+ - has_or_had_date_of_birth
+ # REMOVED: birth_place - migrated to has_or_had_place_of_birth (Rule 53)
+ - has_or_had_place_of_birth
- contact_email
- created
- date_of_death
@@ -148,12 +156,48 @@ classes:
- Required is false initially to allow PersonObservation without hub linkage
- Production data SHOULD always have this link for full PICO compliance
- 'Inverse relationship: Person.has_person_observation (implemented v0.9.8)'
- birth_date:
- range: string
+ has_or_had_date_of_birth:
+ description: >-
+ Birth date of the person using structured BirthDate class.
+ MIGRATED from birth_date slot (Rule 53).
+
+ Supports EDTF notation for uncertain/incomplete dates and
+ tracks provenance for inferred dates per Rule 45.
+ range: BirthDate
+ inlined: true
required: false
- birth_place:
- range: string
+ examples:
+ - value: |
+ birth_edtf: "1970-08-15"
+ is_inferred: false
+ confidence: HIGH
+ description: Full date known
+ - value: |
+ birth_edtf: "197X"
+ is_inferred: true
+ confidence: LOW
+ description: Decade inferred from career start
+ has_or_had_place_of_birth:
+ description: >-
+ Birth place of the person using structured BirthPlace class.
+ MIGRATED from birth_place slot (Rule 53).
+
+ Supports historical vs. modern place names and links to
+ GeoNames/Wikidata for geographic resolution.
+ range: BirthPlace
+ inlined: true
required: false
+ examples:
+ - value: |
+ place_name: Amsterdam
+ country_code: NL
+ geonames_id: 2759794
+ description: Birth place with geographic identifiers
+ - value: |
+ place_name: Batavia
+ modern_place_name: Jakarta
+ country_code: ID
+ description: Historical place name
death_place:
range: string
required: false
diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/PrimaryDigitalPresenceAssertion.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/PrimaryDigitalPresenceAssertion.yaml
index 0be604ced1..f9049bb705 100644
--- a/frontend/public/schemas/20251121/linkml/modules/classes/PrimaryDigitalPresenceAssertion.yaml
+++ b/frontend/public/schemas/20251121/linkml/modules/classes/PrimaryDigitalPresenceAssertion.yaml
@@ -10,7 +10,10 @@ imports:
- ../slots/confidence_score
- ../slots/superseded_by
- ../slots/is_or_was_about_digital_presence
-- ../slots/asserted_by
+# REMOVED - migrated to is_or_was_asserted_by (Rule 53)
+# - ../slots/asserted_by
+- ../slots/is_or_was_asserted_by
+- ./Asserter
- ../slots/has_assertion_date
- ../slots/has_or_had_identifier
- ../slots/has_assertion_rationale
@@ -91,7 +94,9 @@ classes:
- prov:wasGeneratedBy
slots:
- is_or_was_about_digital_presence
- - asserted_by
+ # REMOVED - migrated to is_or_was_asserted_by (Rule 53)
+ # - asserted_by
+ - is_or_was_asserted_by
- has_assertion_date
- has_or_had_identifier
- has_assertion_rationale
@@ -165,6 +170,27 @@ classes:
required: false
examples:
- value: '2025-11-29T14:30:00Z'
+ is_or_was_asserted_by:
+ range: Asserter
+ inlined: true
+ required: false
+ description: >-
+ The agent responsible for making this assertion.
+ MIGRATED from asserted_by (Rule 53) - changed from string to Asserter
+ class for richer provenance tracking.
+ examples:
+ - value:
+ has_or_had_identifier: https://nde.nl/ontology/hc/asserter/primary-presence-analyzer
+ has_or_had_label: primary-presence-analyzer
+ asserter_type: AUTOMATED_SYSTEM
+ asserter_version: "1.0"
+ description: Automated system asserter
+ - value:
+ has_or_had_identifier: https://nde.nl/ontology/hc/asserter/jane-doe
+ has_or_had_label: Jane Doe
+ asserter_type: HUMAN_ANALYST
+ asserter_contact: jane.doe@heritage-org.nl
+ description: Human analyst asserter
was_asserted_by:
range: string
required: false
diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Quantity.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Quantity.yaml
new file mode 100644
index 0000000000..cb42f84bda
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/classes/Quantity.yaml
@@ -0,0 +1,223 @@
+id: https://nde.nl/ontology/hc/class/Quantity
+name: Quantity
+title: Quantity Class
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+ qudt: http://qudt.org/schema/qudt/
+ schema: http://schema.org/
+ dcterms: http://purl.org/dc/terms/
+imports:
+- linkml:types
+- ../enums/QuantityTypeEnum
+- ../slots/has_or_had_identifier
+- ../slots/has_or_had_label
+- ../slots/has_or_had_description
+- ../slots/specificity_annotation
+- ../slots/template_specificity
+- ./SpecificityAnnotation
+- ./TemplateSpecificityScores
+default_prefix: hc
+classes:
+ Quantity:
+ class_uri: qudt:Quantity
+ description: >-
+ A quantified value with an optional unit of measurement and type.
+
+ **QUDT ALIGNMENT**:
+
+ Maps to `qudt:Quantity` - "A quantitative value expressed as a
+ number and a unit of measurement."
+
+ **TYPES OF QUANTITIES**:
+
+ | Type | Description | Example |
+ |------|-------------|---------|
+ | STAFF_COUNT | Number of employees | 42 employees |
+ | COLLECTION_SIZE | Number of items | 1.2 million objects |
+ | VISITOR_COUNT | Annual visitors | 2.5 million/year |
+ | BUDGET_AMOUNT | Financial value | €15 million |
+ | AREA | Physical space | 10,000 m² |
+ | DURATION | Time period | 6 months |
+
+ **USE CASES**:
+
+ 1. **Staff Metrics**: Branch staff count, department size, FTE equivalents
+ 2. **Collection Metrics**: Object counts, archive linear meters, digital items
+ 3. **Visitor Metrics**: Annual attendance, daily capacity, peak visitors
+ 4. **Financial Metrics**: Budget, revenue, acquisition costs
+ 5. **Physical Metrics**: Floor area, gallery space, storage capacity
+
+ **WHY NOT JUST USE INTEGER?**
+
+ Simple integer fields like `branch_staff_count: 3` lose important context:
+ - What's the unit? (FTE? headcount? contractors included?)
+ - When was this measured? (provenance)
+ - Is this exact or estimated?
+ - What type of quantity is this?
+
+ The Quantity class captures this richness while remaining simple for basic use.
+
+ **EXAMPLE**:
+
+ ```yaml
+ Quantity:
+ quantity_id: https://nde.nl/ontology/hc/quantity/nha-zaanstreek-staff-2025
+ quantity_value: 3
+ quantity_type: STAFF_COUNT
+ quantity_unit: FTE
+ quantity_description: Staff assigned to Zaanstreek-Waterland branch
+ quantity_date: 2025-01-01
+ ```
+ exact_mappings:
+ - qudt:Quantity
+ close_mappings:
+ - schema:QuantitativeValue
+ related_mappings:
+ - schema:numberOfEmployees
+ - schema:floorSize
+ - dcterms:extent
+ slots:
+ - has_or_had_identifier
+ - quantity_value
+ - quantity_type
+ - quantity_unit
+ - has_or_had_description
+ - quantity_date
+ - is_estimate
+ - specificity_annotation
+ - template_specificity
+ slot_usage:
+ has_or_had_identifier:
+ range: uriorcurie
+ required: false
+ identifier: true
+ description: >-
+ Optional identifier for this quantity measurement.
+ examples:
+ - value: https://nde.nl/ontology/hc/quantity/nha-zaanstreek-staff-2025
+ description: Branch staff count measurement
+ quantity_value:
+ range: float
+ required: true
+ description: >-
+ The numeric value of the quantity.
+ examples:
+ - value: 3
+ description: 3 staff members
+ - value: 1200000
+ description: 1.2 million collection items
+ - value: 2500000
+ description: 2.5 million annual visitors
+ quantity_type:
+ range: QuantityTypeEnum
+ required: false
+ description: >-
+ The type of quantity being measured.
+ examples:
+ - value: STAFF_COUNT
+ - value: COLLECTION_SIZE
+ - value: VISITOR_COUNT
+ quantity_unit:
+ range: string
+ required: false
+ description: >-
+ The unit of measurement (if applicable).
+ examples:
+ - value: FTE
+ description: Full-time equivalent employees
+ - value: headcount
+ description: Total number of people
+ - value: items
+ description: Collection item count
+ - value: linear meters
+ description: Archive extent
+ - value: EUR
+ description: Budget in euros
+ - value: m²
+ description: Floor area
+ has_or_had_description:
+ range: string
+ required: false
+ description: >-
+ Description of what this quantity represents.
+ examples:
+ - value: Staff assigned to Zaanstreek-Waterland branch
+ - value: Annual visitor count for 2024
+ quantity_date:
+ range: date
+ required: false
+ description: >-
+ Date when this quantity was measured or is valid.
+ examples:
+ - value: '2025-01-01'
+ is_estimate:
+ range: boolean
+ required: false
+ ifabsent: 'false'
+ description: >-
+ Whether this quantity is an estimate rather than an exact count.
+ examples:
+ - value: false
+ description: Exact count
+ - value: true
+ description: Estimated value
+ comments:
+ - Quantity models quantified values with units and provenance
+ - Replaces simple integer fields with richer structured data
+ - Uses QUDT Quantity as primary ontology mapping
+ - Supports various quantity types (staff, collection, visitor, budget)
+ see_also:
+ - http://qudt.org/schema/qudt/Quantity
+ - https://schema.org/QuantitativeValue
+ examples:
+ - value:
+ has_or_had_identifier: https://nde.nl/ontology/hc/quantity/nha-zaanstreek-staff-2025
+ quantity_value: 3
+ quantity_type: STAFF_COUNT
+ quantity_unit: FTE
+ has_or_had_description: Staff assigned to Zaanstreek-Waterland branch
+ quantity_date: '2025-01-01'
+ is_estimate: false
+ description: Branch staff count
+ - value:
+ quantity_value: 1200000
+ quantity_type: COLLECTION_SIZE
+ quantity_unit: items
+ has_or_had_description: Total collection size including artworks, documents, and photographs
+ is_estimate: true
+ description: Estimated collection size
+ - value:
+ quantity_value: 2500000
+ quantity_type: VISITOR_COUNT
+ quantity_unit: visitors/year
+ has_or_had_description: Annual visitor count for 2024
+ quantity_date: '2024-12-31'
+ is_estimate: false
+ description: Annual visitor count
+slots:
+ quantity_value:
+ description: >-
+ The numeric value of the quantity.
+ range: float
+ slot_uri: qudt:numericValue
+ quantity_type:
+ description: >-
+ The type of quantity being measured.
+ range: QuantityTypeEnum
+ slot_uri: hc:quantityType
+ quantity_unit:
+ description: >-
+ The unit of measurement (if applicable).
+ range: string
+ slot_uri: qudt:unit
+ quantity_date:
+ description: >-
+ Date when this quantity was measured or is valid.
+ range: date
+ slot_uri: dcterms:date
+ is_estimate:
+ description: >-
+ Whether this quantity is an estimate rather than an exact count.
+ range: boolean
+ slot_uri: hc:isEstimate
diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/StorageConditionPolicy.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/StorageConditionPolicy.yaml
index c9d0cb6654..a74ba47144 100644
--- a/frontend/public/schemas/20251121/linkml/modules/classes/StorageConditionPolicy.yaml
+++ b/frontend/public/schemas/20251121/linkml/modules/classes/StorageConditionPolicy.yaml
@@ -237,11 +237,20 @@ classes:
- value: '2020-01-01'
policy_effective_to:
range: date
- policy_approved_by:
- range: string
+ is_or_was_approved_by:
+ description: >-
+ Agent (person/organization) that approved this policy.
+ MIGRATED from policy_approved_by (2026-01-15) per Rule 39.
+ Range changed from string to Approver class for structured approval tracking.
+ range: Approver
+ required: false
examples:
- - value: Collections Committee
- - value: Director of Collections
+ - value:
+ approver_name: Collections Committee
+ description: Committee approval
+ - value:
+ approver_name: Director of Collections
+ description: Individual approval
policy_review_date:
range: date
examples:
@@ -284,7 +293,8 @@ classes:
- EN_15757_2010
- EN_16893_2018
policy_effective_from: '2020-01-01'
- policy_approved_by: Collections Committee
+ is_or_was_approved_by:
+ approver_name: Collections Committee
policy_review_date: '2025-12-31'
description: Museum art storage climate policy
- value:
@@ -313,6 +323,7 @@ classes:
- IMAGE_PERMANENCE_INSTITUTE
- ISO_TR_19815_2018
policy_effective_from: '2015-06-01'
- policy_approved_by: General Rijksarchivaris
+ is_or_was_approved_by:
+ approver_name: General Rijksarchivaris
policy_review_date: '2025-06-01'
description: Archive cold storage policy for photographic materials
diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/StorageUnit.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/StorageUnit.yaml
index 7191e38001..bd093576a8 100644
--- a/frontend/public/schemas/20251121/linkml/modules/classes/StorageUnit.yaml
+++ b/frontend/public/schemas/20251121/linkml/modules/classes/StorageUnit.yaml
@@ -195,12 +195,11 @@ classes:
unit_name: Archive Box 145 - WWII Ministry Records
unit_type: ARCHIVE_BOX
unit_description: 'Acid-free archive box containing Ministry of Defense
-
- correspondence from 1940-1945. Handle with care.
-
- '
+ correspondence from 1940-1945. Handle with care.'
row_number: '12'
- bay_number: '3'
+ has_or_had_identifier:
+ - value: '3'
+ _type: BayNumber
shelf_number: 4
part_of_zone: https://nde.nl/ontology/hc/zone/na-depot-a-standard
valid_from: '2020-03-15'
@@ -211,10 +210,7 @@ classes:
unit_name: Flat File Drawer 42 - Netherlands Maps
unit_type: FLAT_FILE_DRAWER
unit_description: 'Flat file drawer containing oversized maps of the
-
- Netherlands, 1850-1920. Climate-controlled environment.
-
- '
+ Netherlands, 1850-1920. Climate-controlled environment.'
drawer_number: 42
capacity_items: 50
current_item_count: 38
diff --git a/frontend/public/schemas/20251121/linkml/modules/enums/AsserterTypeEnum.yaml b/frontend/public/schemas/20251121/linkml/modules/enums/AsserterTypeEnum.yaml
new file mode 100644
index 0000000000..22832e4d92
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/enums/AsserterTypeEnum.yaml
@@ -0,0 +1,31 @@
+id: https://nde.nl/ontology/hc/enum/AsserterTypeEnum
+name: AsserterTypeEnum
+title: Asserter Type Enum
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+ prov: http://www.w3.org/ns/prov#
+ foaf: http://xmlns.com/foaf/0.1/
+imports:
+- linkml:types
+default_prefix: hc
+enums:
+ AsserterTypeEnum:
+ description: >-
+ Type of agent making an assertion.
+ enum_uri: hc:AsserterTypeEnum
+ permissible_values:
+ HUMAN_ANALYST:
+ description: Human expert or analyst making a judgment.
+ meaning: foaf:Person
+ AUTOMATED_SYSTEM:
+ description: Software system or script performing automated analysis.
+ meaning: prov:SoftwareAgent
+ AI_AGENT:
+ description: AI/ML model or agent making an assertion.
+ meaning: prov:SoftwareAgent
+ ORGANIZATION:
+ description: Organization or institution making a formal assertion.
+ meaning: foaf:Organization
+ UNKNOWN:
+ description: Asserter type is not specified or cannot be determined.
diff --git a/frontend/public/schemas/20251121/linkml/modules/enums/QuantityTypeEnum.yaml b/frontend/public/schemas/20251121/linkml/modules/enums/QuantityTypeEnum.yaml
new file mode 100644
index 0000000000..04ef0e09d9
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/enums/QuantityTypeEnum.yaml
@@ -0,0 +1,43 @@
+id: https://nde.nl/ontology/hc/enum/QuantityTypeEnum
+name: QuantityTypeEnum
+title: Quantity Type Enum
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+ qudt: http://qudt.org/schema/qudt/
+ schema: http://schema.org/
+imports:
+- linkml:types
+default_prefix: hc
+enums:
+ QuantityTypeEnum:
+ description: >-
+ Type of quantity being measured.
+ enum_uri: hc:QuantityTypeEnum
+ permissible_values:
+ STAFF_COUNT:
+ description: Number of staff members or employees.
+ meaning: schema:numberOfEmployees
+ COLLECTION_SIZE:
+ description: Number of items in a collection.
+ meaning: schema:size
+ VISITOR_COUNT:
+ description: Number of visitors (annual, daily, etc.).
+ meaning: schema:numberOfAttendees
+ BUDGET_AMOUNT:
+ description: Financial amount (budget, revenue, cost).
+ meaning: schema:amount
+ AREA:
+ description: Physical area or floor space.
+ meaning: schema:floorSize
+ DURATION:
+ description: Time duration or period.
+ meaning: schema:duration
+ LINEAR_EXTENT:
+ description: Linear measurement (e.g., archive meters).
+ meaning: qudt:Length
+ CAPACITY:
+ description: Maximum capacity (seats, storage, etc.).
+ meaning: schema:maximumAttendeeCapacity
+ OTHER:
+ description: Other type of quantity not listed.
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/approximation_level.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/approximation_level.yaml
new file mode 100644
index 0000000000..6a40a87ed5
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/slots/approximation_level.yaml
@@ -0,0 +1,26 @@
+id: https://nde.nl/ontology/hc/slot/approximation_level
+name: approximation_level_slot
+title: Approximation Level Slot
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+imports:
+- linkml:types
+default_prefix: hc
+slots:
+ approximation_level:
+ description: >-
+ Level of approximation/uncertainty for a value.
+
+ See ApproximationLevelEnum for valid values:
+ - EXACT: Known with certainty
+ - APPROXIMATE: Close but not exact
+ - ESTIMATED: Calculated/inferred
+ - UNCERTAIN: Significant doubt
+ - UNKNOWN: Cannot be determined
+ range: string
+ slot_uri: hc:approximationLevel
+ annotations:
+ specificity_score: 0.30
+ specificity_rationale: >-
+ Approximation level is broadly useful for expressing uncertainty.
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/approximate.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/approximate_archived_20260114.yaml
similarity index 100%
rename from frontend/public/schemas/20251121/linkml/modules/slots/approximate.yaml
rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/approximate_archived_20260114.yaml
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/asserted_by.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/asserted_by_archived_20260114.yaml
similarity index 100%
rename from frontend/public/schemas/20251121/linkml/modules/slots/asserted_by.yaml
rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/asserted_by_archived_20260114.yaml
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/authors.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/authors_archived_20260114.yaml
similarity index 100%
rename from frontend/public/schemas/20251121/linkml/modules/slots/authors.yaml
rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/authors_archived_20260114.yaml
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/auxiliary_places.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/auxiliary_places_archived_20260114.yaml
similarity index 100%
rename from frontend/public/schemas/20251121/linkml/modules/slots/auxiliary_places.yaml
rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/auxiliary_places_archived_20260114.yaml
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/auxiliary_platforms.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/auxiliary_platforms_archived_20260114.yaml
similarity index 100%
rename from frontend/public/schemas/20251121/linkml/modules/slots/auxiliary_platforms.yaml
rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/auxiliary_platforms_archived_20260114.yaml
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/birth_date.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/birth_date_archived_20260114.yaml
similarity index 100%
rename from frontend/public/schemas/20251121/linkml/modules/slots/birth_date.yaml
rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/birth_date_archived_20260114.yaml
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/birth_place.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/birth_place_archived_20260114.yaml
similarity index 100%
rename from frontend/public/schemas/20251121/linkml/modules/slots/birth_place.yaml
rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/birth_place_archived_20260114.yaml
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/branch_service_area.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/branch_service_area_archived_20260114.yaml
similarity index 100%
rename from frontend/public/schemas/20251121/linkml/modules/slots/branch_service_area.yaml
rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/branch_service_area_archived_20260114.yaml
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/branch_staff_count.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/branch_staff_count_archived_20260114.yaml
similarity index 100%
rename from frontend/public/schemas/20251121/linkml/modules/slots/branch_staff_count.yaml
rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/branch_staff_count_archived_20260114.yaml
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_author.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/has_author_archived_20260114.yaml
similarity index 100%
rename from frontend/public/schemas/20251121/linkml/modules/slots/has_author.yaml
rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/has_author_archived_20260114.yaml
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/archive/policy_approved_by_archived_20260115.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/policy_approved_by_archived_20260115.yaml
new file mode 100644
index 0000000000..eed99fc4c2
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/slots/archive/policy_approved_by_archived_20260115.yaml
@@ -0,0 +1,32 @@
+# ARCHIVED: 2026-01-15
+# REASON: Migrated to is_or_was_approved_by + Approver class (Rule 39, Rule 53)
+# REPLACEMENT: is_or_was_approved_by with range Approver
+# MIGRATION: Migration 30 - approved_by family consolidation
+#
+# This slot was specific to StorageConditionPolicy. It has been replaced by
+# the generic is_or_was_approved_by slot which uses the Approver class for
+# structured approval tracking with temporal semantics.
+#
+# Original slot preserved below for reference.
+
+id: https://nde.nl/ontology/hc/slot/policy_approved_by
+name: policy_approved_by_slot
+title: Policy Approved By Slot (ARCHIVED)
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+imports:
+- linkml:types
+default_prefix: hc
+slots:
+ policy_approved_by:
+ description: |
+ ARCHIVED: 2026-01-15
+ REPLACEMENT: is_or_was_approved_by with range Approver
+
+ Original description:
+ Person or body that approved this policy.
+ range: string
+ slot_uri: hc:policyApprovedBy
+ deprecated: "Use is_or_was_approved_by with Approver class instead"
+ deprecated_element_has_exact_replacement: is_or_was_approved_by
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/archive/was_approved_by_archived_20260115.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/was_approved_by_archived_20260115.yaml
new file mode 100644
index 0000000000..c10cd7cd81
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/slots/archive/was_approved_by_archived_20260115.yaml
@@ -0,0 +1,52 @@
+# ARCHIVED: 2026-01-15
+# REASON: Migrated to is_or_was_approved_by + Approver class (Rule 39, Rule 53)
+# REPLACEMENT: is_or_was_approved_by with range Approver
+# MIGRATION: Migration 30 - approved_by family consolidation
+#
+# This slot was used in Budget class. It has been replaced by the generic
+# is_or_was_approved_by slot which uses the Approver class for structured
+# approval tracking with temporal semantics following RiC-O naming conventions.
+#
+# Original slot preserved below for reference.
+
+id: https://nde.nl/ontology/hc/slot/was_approved_by
+name: was_approved_by_slot
+title: Was Approved By Slot (ARCHIVED)
+prefixes:
+ dcterms: http://purl.org/dc/terms/
+ hc: https://nde.nl/ontology/hc/
+ linkml: https://w3id.org/linkml/
+ prov: http://www.w3.org/ns/prov#
+ schema: http://schema.org/
+imports:
+- linkml:types
+default_prefix: hc
+slots:
+ was_approved_by:
+ description: |
+ ARCHIVED: 2026-01-15
+ REPLACEMENT: is_or_was_approved_by with range Approver
+
+ Original description:
+ Governance body or authority that approved budget.
+
+ **Examples**:
+ - "Board of Directors"
+ - "Executive Committee"
+ - "Ministry of Culture"
+ - "City Council"
+ range: string
+ slot_uri: prov:wasAttributedTo
+ exact_mappings:
+ - prov:wasAttributedTo
+ close_mappings:
+ - dcterms:creator
+ - prov:wasInfluencedBy
+ annotations:
+ custodian_types: '["*"]'
+ custodian_types_rationale: Applicable to all heritage custodian types.
+ custodian_types_primary: M
+ specificity_score: 0.5
+ specificity_rationale: Moderately specific slot.
+ deprecated: "Use is_or_was_approved_by with Approver class instead"
+ deprecated_element_has_exact_replacement: is_or_was_approved_by
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_author.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_author.yaml
new file mode 100644
index 0000000000..7119994aa7
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_author.yaml
@@ -0,0 +1,61 @@
+id: https://nde.nl/ontology/hc/slot/has_or_had_author
+name: has_or_had_author_slot
+title: Has Or Had Author Slot
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+ schema: http://schema.org/
+ dcterms: http://purl.org/dc/terms/
+ bf: http://id.loc.gov/ontologies/bibframe/
+ bibo: http://purl.org/ontology/bibo/
+ rico: https://www.ica.org/standards/RiC/ontology#
+imports:
+- linkml:types
+default_prefix: hc
+slots:
+ has_or_had_author:
+ description: >-
+ Person or organization that authored/created a work.
+
+ Links to Author class which models creators of creative works such as
+ catalogs, publications, reports, and other documentary outputs.
+
+ **RiC-O Alignment**: Follows RiC-O temporal relationship pattern (has/had)
+ for properties that may change over time (e.g., posthumous attributions,
+ disputed authorship).
+
+ **Schema.org/Dublin Core Alignment**: Maps to schema:author and dcterms:creator.
+
+ **BIBFRAME Alignment**: Related to bf:contribution for bibliographic works.
+
+ **Use Cases**:
+ - Exhibition catalog authors
+ - Research report authors
+ - Finding aid compilers
+ - Publication contributors
+
+ **MIGRATED from authors (Rule 53)**: Changed from string to Author class
+ for structured authorship modeling including roles, affiliations, and temporal
+ aspects.
+ slot_uri: schema:author
+ range: Author
+ multivalued: true
+ inlined: true
+ exact_mappings:
+ - schema:author
+ - dcterms:creator
+ close_mappings:
+ - bf:contribution
+ - bibo:authorList
+ related_mappings:
+ - rico:hasOrHadAuthor
+ annotations:
+ owl.template: |-
+ AnnotationAssertion( rdfs:label {{slot_uri}} "has or had author"@en )
+ specificity_score: 0.35
+ specificity_rationale: >-
+ Authorship is broadly useful for any creative/documentary work
+ produced by heritage custodians.
+ custodian_types: '["*"]'
+ custodian_types_rationale: >-
+ All custodian types may produce authored works (catalogs, reports, etc.).
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_auxiliary_entities.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_auxiliary_entities.yaml
new file mode 100644
index 0000000000..c6681c6e82
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_auxiliary_entities.yaml
@@ -0,0 +1,58 @@
+id: https://nde.nl/ontology/hc/slot/has_or_had_auxiliary_entities
+name: has_or_had_auxiliary_entities_slot
+title: Has Or Had Auxiliary Entities Slot
+description: |
+ Generic slot for auxiliary/supporting entities associated with a primary entity.
+
+ CREATED as part of slot migration (Rule 53) to replace:
+ - `auxiliary_places` → range: AuxiliaryPlace
+ - `auxiliary_platforms` → range: AuxiliaryPlatform
+
+ Follows RiC-O temporal predicate pattern (has_or_had_*).
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+ rico: https://www.ica.org/standards/RiC/ontology#
+ schema: http://schema.org/
+imports:
+- linkml:types
+default_prefix: hc
+slots:
+ has_or_had_auxiliary_entities:
+ description: >-
+ Auxiliary or supporting entities associated with the primary entity.
+
+ **SEMANTIC PATTERN**:
+
+ This slot follows the RiC-O temporal predicate pattern (has_or_had_*)
+ to indicate that auxiliary relationships may change over time.
+
+ **REPLACES**:
+
+ - `auxiliary_places` - Physical locations supporting the main entity
+ - `auxiliary_platforms` - Digital platforms supporting the main entity
+
+ **USE CASES**:
+
+ 1. **Storage locations**: Off-site storage, external repositories
+ 2. **Branch facilities**: Satellite offices, reading rooms
+ 3. **Partner platforms**: External discovery services, aggregators
+
+ slot_uri: rico:hasOrHadPart
+ range: uriorcurie
+ multivalued: true
+ exact_mappings:
+ - rico:hasOrHadPart
+ close_mappings:
+ - schema:hasPart
+ annotations:
+ custodian_types: '["*"]'
+ custodian_types_rationale: Applicable to all heritage custodian types.
+ custodian_types_primary: M
+ specificity_score: 0.4
+ specificity_rationale: Broadly applicable auxiliary entity relationship.
+ examples:
+ - value: "hc:auxiliary-place/rijksmuseum-depot-amersfoort"
+ description: Off-site storage depot
+ - value: "hc:auxiliary-platform/europeana-aggregation"
+ description: External discovery platform
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_date_of_birth.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_date_of_birth.yaml
new file mode 100644
index 0000000000..deb678e94b
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_date_of_birth.yaml
@@ -0,0 +1,61 @@
+id: https://nde.nl/ontology/hc/slot/has_or_had_date_of_birth
+name: has_or_had_date_of_birth_slot
+title: Has or Had Date of Birth Slot
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+ schema: http://schema.org/
+ crm: http://www.cidoc-crm.org/cidoc-crm/
+ rico: https://www.ica.org/standards/RiC/ontology#
+ foaf: http://xmlns.com/foaf/0.1/
+imports:
+ - linkml:types
+default_prefix: hc
+slots:
+ has_or_had_date_of_birth:
+ slot_uri: schema:birthDate
+ description: >-
+ The birth date of a person, modeled as a structured BirthDate class.
+
+ **TEMPORAL SEMANTICS (RiC-O Pattern)**:
+
+ Uses "has_or_had" prefix to indicate the relationship may be:
+ - Current (person is alive with this birth date)
+ - Historical (person is deceased, birth date is historical fact)
+
+ **ONTOLOGY ALIGNMENT**:
+
+ | Ontology | Property | Usage |
+ |----------|----------|-------|
+ | **Schema.org** | `schema:birthDate` | Primary property (web semantics) |
+ | **FOAF** | `foaf:birthday` | Social network date |
+ | **CIDOC-CRM** | `crm:P98i_was_born` → `crm:E67_Birth` | Birth event |
+ | **RiC-O** | `rico:birthDate` | Archival person modeling |
+
+ **INCOMPLETE DATES**:
+
+ Per Rule 44 (EDTF), incomplete dates are modeled using BirthDate class:
+ - Decade known: `birth_edtf: "197X"`
+ - Century known: `birth_edtf: "19XX"`
+ - Approximate: `birth_edtf: "1985~"`
+
+ **MIGRATION NOTE**:
+
+ Replaces simple `birth_date` string slot with structured BirthDate class
+ per Rule 53 (Full Slot Migration). This enables:
+ - EDTF date notation support
+ - Provenance tracking for inferred dates
+ - Confidence scoring
+ range: BirthDate
+ required: false
+ inlined: true
+ exact_mappings:
+ - schema:birthDate
+ - foaf:birthday
+ close_mappings:
+ - crm:P98i_was_born
+ - rico:birthDate
+ comments:
+ - "MIGRATED from birth_date slot (Rule 53)"
+ - "Supports EDTF notation for uncertain/incomplete dates"
+ - "BirthDate class provides provenance for inferred birth dates"
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_place_of_birth.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_place_of_birth.yaml
new file mode 100644
index 0000000000..ed45c04390
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_place_of_birth.yaml
@@ -0,0 +1,58 @@
+id: https://nde.nl/ontology/hc/slot/has_or_had_place_of_birth
+name: has_or_had_place_of_birth_slot
+title: Has or Had Place of Birth Slot
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+ schema: http://schema.org/
+ crm: http://www.cidoc-crm.org/cidoc-crm/
+ rico: https://www.ica.org/standards/RiC/ontology#
+ foaf: http://xmlns.com/foaf/0.1/
+imports:
+ - linkml:types
+default_prefix: hc
+slots:
+ has_or_had_place_of_birth:
+ slot_uri: schema:birthPlace
+ description: >-
+ The place where a person was born, modeled as a structured BirthPlace class.
+
+ **TEMPORAL SEMANTICS (RiC-O Pattern)**:
+
+ Uses "has_or_had" prefix to indicate the relationship:
+ - Historical fact (birth location doesn't change)
+ - May use historical place names vs. modern equivalents
+
+ **ONTOLOGY ALIGNMENT**:
+
+ | Ontology | Property | Usage |
+ |----------|----------|-------|
+ | **Schema.org** | `schema:birthPlace` | Primary property |
+ | **FOAF** | `foaf:based_near` | Location association |
+ | **CIDOC-CRM** | `crm:P7_took_place_at` via Birth event | Place of birth event |
+ | **RiC-O** | `rico:birthPlace` | Archival person modeling |
+
+ **PLACE RESOLUTION**:
+
+ BirthPlace class enables:
+ - Historical place name preservation (e.g., "Batavia")
+ - Modern equivalent linkage (e.g., "Jakarta")
+ - GeoNames/Wikidata identifier linking
+ - Coordinate storage for mapping
+
+ **MIGRATION NOTE**:
+
+ Replaces simple `birth_place` string slot with structured BirthPlace class
+ per Rule 53 (Full Slot Migration).
+ range: BirthPlace
+ required: false
+ inlined: true
+ exact_mappings:
+ - schema:birthPlace
+ close_mappings:
+ - crm:P7_took_place_at
+ - rico:birthPlace
+ comments:
+ - "MIGRATED from birth_place slot (Rule 53)"
+ - "Supports historical vs. modern place names"
+ - "Links to GeoNames/Wikidata for disambiguation"
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_quantity.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_quantity.yaml
new file mode 100644
index 0000000000..a54b951ff1
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_quantity.yaml
@@ -0,0 +1,39 @@
+id: https://nde.nl/ontology/hc/slot/has_or_had_quantity
+name: has_or_had_quantity_slot
+title: Has Or Had Quantity Slot
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+ qudt: http://qudt.org/schema/qudt/
+ schema: http://schema.org/
+imports:
+- linkml:types
+default_prefix: hc
+slots:
+ has_or_had_quantity:
+ description: >-
+ A quantified value associated with an entity. Uses RiC-O temporal
+ naming pattern to indicate the quantity may be current or historical.
+
+ QUDT: Quantity - "A quantitative value expressed as a number and
+ a unit of measurement."
+
+ Can represent staff counts, collection sizes, visitor numbers,
+ budget amounts, area measurements, and other quantifiable properties.
+ range: Quantity
+ slot_uri: qudt:Quantity
+ exact_mappings:
+ - qudt:Quantity
+ close_mappings:
+ - schema:QuantitativeValue
+ related_mappings:
+ - schema:numberOfEmployees
+ - schema:floorSize
+ annotations:
+ custodian_types: '["*"]'
+ custodian_types_rationale: Quantities can be associated with any heritage custodian type.
+ custodian_types_primary: M
+ specificity_score: 0.3
+ specificity_rationale: >-
+ Generic quantity slot applicable across many contexts where
+ quantitative values need to be captured with units and provenance.
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_service_area.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_service_area.yaml
new file mode 100644
index 0000000000..426f32ab3e
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_service_area.yaml
@@ -0,0 +1,54 @@
+id: https://nde.nl/ontology/hc/slot/has_or_had_service_area
+name: has_or_had_service_area_slot
+title: Has Or Had Service Area Slot
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+ schema: http://schema.org/
+ org: http://www.w3.org/ns/org#
+ rico: https://www.ica.org/standards/RiC/ontology#
+imports:
+- linkml:types
+default_prefix: hc
+slots:
+ has_or_had_service_area:
+ description: >-
+ Geographic area or community served by an entity.
+
+ Links to ServiceArea class which models the "werkgebied" (operational territory)
+ of heritage custodians - the geographic area where they provide services and
+ collect materials.
+
+ **RiC-O Alignment**: Follows RiC-O temporal relationship pattern (has/had)
+ for properties that may change over time.
+
+ **Schema.org Alignment**: Maps to schema:areaServed for service coverage.
+
+ **Use Cases**:
+ - Archive branch serving specific municipalities
+ - Library branch serving neighborhood/district
+ - Museum outpost serving regional community
+
+ **MIGRATED from branch_service_area (Rule 53)**: Changed from string to
+ ServiceArea class for richer geographic modeling including boundaries,
+ temporal validity, and administrative hierarchy.
+ slot_uri: schema:areaServed
+ range: ServiceArea
+ inlined: true
+ exact_mappings:
+ - schema:areaServed
+ close_mappings:
+ - org:hasSite
+ - rico:hasOrHadLocation
+ annotations:
+ owl.template: |-
+ AnnotationAssertion( rdfs:label {{slot_uri}} "has or had service area"@en )
+ specificity_score: 0.45
+ specificity_rationale: >-
+ Service area is moderately specific - relevant for organizational/geographic
+ contexts but not universally applicable.
+ custodian_types: '["A", "L", "M", "O", "R"]'
+ custodian_types_rationale: >-
+ Service areas are most relevant to archives (A), libraries (L), museums (M),
+ official institutions (O), and research centers (R) that have geographic
+ service mandates.
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_approximate.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_approximate.yaml
new file mode 100644
index 0000000000..c2b94c086e
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_approximate.yaml
@@ -0,0 +1,54 @@
+id: https://nde.nl/ontology/hc/slot/is_or_was_approximate
+name: is_or_was_approximate_slot
+title: Is Or Was Approximate Slot
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+ schema: http://schema.org/
+ crm: http://www.cidoc-crm.org/cidoc-crm/
+ rico: https://www.ica.org/standards/RiC/ontology#
+imports:
+- linkml:types
+default_prefix: hc
+slots:
+ is_or_was_approximate:
+ description: >-
+ Indicates whether a value (date, quantity, etc.) is approximate or uncertain.
+
+ Links to ApproximationStatus class which models different levels of uncertainty:
+ - exact: Known with certainty
+ - approximate: Close but not exact (circa, roughly)
+ - estimated: Calculated/inferred value
+ - uncertain: Significant doubt about accuracy
+ - unknown: Value cannot be determined
+
+ **RiC-O Alignment**: Follows RiC-O temporal relationship pattern (is/was)
+ for properties that may change over time as more information becomes available.
+
+ **CIDOC-CRM Alignment**: Related to crm:E52_Time-Span precision modeling.
+
+ **Use Cases**:
+ - Date approximation: "circa 1880" vs "1880-03-15"
+ - Event timing uncertainty: founding date known only to year
+ - Quantity estimates: "approximately 10,000 items"
+
+ **MIGRATED from approximate (Rule 53)**: Changed from string to
+ ApproximationStatus class for structured uncertainty modeling.
+ slot_uri: hc:isOrWasApproximate
+ range: ApproximationStatus
+ inlined: true
+ close_mappings:
+ - crm:P79_beginning_is_qualified_by
+ - crm:P80_end_is_qualified_by
+ related_mappings:
+ - rico:certainty
+ annotations:
+ owl.template: |-
+ AnnotationAssertion( rdfs:label {{slot_uri}} "is or was approximate"@en )
+ specificity_score: 0.30
+ specificity_rationale: >-
+ Approximation status is broadly useful across many contexts where
+ uncertainty needs to be expressed (dates, quantities, etc.).
+ custodian_types: '["*"]'
+ custodian_types_rationale: >-
+ Approximation/uncertainty is universal across all custodian types.
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_asserted_by.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_asserted_by.yaml
new file mode 100644
index 0000000000..4881931478
--- /dev/null
+++ b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_asserted_by.yaml
@@ -0,0 +1,38 @@
+id: https://nde.nl/ontology/hc/slot/is_or_was_asserted_by
+name: is_or_was_asserted_by_slot
+title: Is Or Was Asserted By Slot
+prefixes:
+ linkml: https://w3id.org/linkml/
+ hc: https://nde.nl/ontology/hc/
+ prov: http://www.w3.org/ns/prov#
+ dcterms: http://purl.org/dc/terms/
+imports:
+- linkml:types
+default_prefix: hc
+slots:
+ is_or_was_asserted_by:
+ description: >-
+ The agent (person, organization, or system) responsible for making
+ an assertion. Uses RiC-O temporal naming pattern to indicate the
+ relationship may be current or historical.
+
+ PROV-O: wasAttributedTo - "links an entity to an agent that it
+ may have been attributed to."
+
+ Can be a human analyst, automated system, or AI agent.
+ range: Asserter
+ slot_uri: prov:wasAttributedTo
+ exact_mappings:
+ - prov:wasAttributedTo
+ close_mappings:
+ - dcterms:creator
+ related_mappings:
+ - prov:wasAssociatedWith
+ annotations:
+ custodian_types: '["*"]'
+ custodian_types_rationale: Assertions can be made about any heritage custodian type.
+ custodian_types_primary: M
+ specificity_score: 0.4
+ specificity_rationale: >-
+ Generic provenance slot applicable across many contexts where
+ attribution of assertions is needed.
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/policy_approved_by.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/policy_approved_by.yaml
deleted file mode 100644
index 5fca943172..0000000000
--- a/frontend/public/schemas/20251121/linkml/modules/slots/policy_approved_by.yaml
+++ /dev/null
@@ -1,16 +0,0 @@
-id: https://nde.nl/ontology/hc/slot/policy_approved_by
-name: policy_approved_by_slot
-title: Policy Approved By Slot
-prefixes:
- linkml: https://w3id.org/linkml/
- hc: https://nde.nl/ontology/hc/
-imports:
-- linkml:types
-default_prefix: hc
-slots:
- policy_approved_by:
- description: 'Person or body that approved this policy.
-
- '
- range: string
- slot_uri: hc:policyApprovedBy
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml
index 624c39463a..425e7c2dbf 100644
--- a/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml
+++ b/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml
@@ -421,10 +421,22 @@ fixes:
- original_slot_id: https://nde.nl/ontology/hc/slot/approved_by
processed:
- status: false
- timestamp: null
- session: null
- notes: "Requires Approver class creation"
+ status: true
+ timestamp: '2026-01-15T10:00:00Z'
+ session: "slot-migration-session-30"
+ notes: |
+ MIGRATED: approved_by family → is_or_was_approved_by + Approver (Migration 30)
+
+ This migration consolidated 3 related slots:
+ - approved_by (already archived 2026-01-14)
+ - was_approved_by → archived to archive/was_approved_by_archived_20260115.yaml
+ - policy_approved_by → archived to archive/policy_approved_by_archived_20260115.yaml
+
+ Classes updated:
+ - Budget.yaml: Fixed malformed slot name, updated slot_usage to use Approver range
+ - StorageConditionPolicy.yaml: Updated slots and slot_usage, migrated examples
+
+ All three slots now consolidated into is_or_was_approved_by with range Approver.
revision:
- label: is_or_was_approved_by
type: slot
@@ -433,10 +445,10 @@ fixes:
- original_slot_id: https://nde.nl/ontology/hc/slot/approximate
processed:
- status: false
- timestamp: null
- session: null
- notes: "Requires ApproximationStatus class creation"
+ status: true
+ timestamp: "2026-01-14T12:45:00Z"
+ session: "slot-migration-session-20260114"
+ notes: "COMPLETED: Created is_or_was_approximate slot and ApproximationStatus class with ApproximationLevelEnum (EXACT, APPROXIMATE, ESTIMATED, UNCERTAIN, UNKNOWN). Also created approximation_level slot. Updated CustodianTimelineEvent.yaml imports, slots list, slot_usage with range ApproximationStatus, and examples (added 5th example showing approximate date). Archived approximate to archive/approximate_archived_20260114.yaml"
revision:
- label: is_or_was_approximate
type: slot
@@ -445,10 +457,18 @@ fixes:
- original_slot_id: https://nde.nl/ontology/hc/slot/archived_at
processed:
- status: false
- timestamp: null
- session: null
- notes: "Maps to existing HeritageCustodianPlace class"
+ status: true
+ timestamp: '2026-01-15T09:00:00Z'
+ session: "slot-migration-session-29"
+ notes: |
+ MIGRATED: archived_at → is_or_was_archived_at (Migration 29)
+
+ Applied RiC-O temporal naming convention (Rule 39).
+ Updated classes:
+ - WebObservation.yaml
+ - AuxiliaryDigitalPlatform.yaml
+
+ Archived to modules/slots/archive/archived_at_archived_20260115.yaml
revision:
- label: is_or_was_archived_at
type: slot
@@ -489,10 +509,10 @@ fixes:
- original_slot_id: https://nde.nl/ontology/hc/slot/asserted_by
processed:
- status: false
- timestamp: null
- session: null
- notes: "Requires Asserter class creation"
+ status: true
+ timestamp: '2026-01-14T23:30:00Z'
+ session: "session-2026-01-14-slot-migrations"
+ notes: "FULLY MIGRATED: Created is_or_was_asserted_by slot, Asserter class, and AsserterTypeEnum. PrimaryDigitalPresenceAssertion.yaml updated with new imports, slots, and slot_usage. Old asserted_by slot archived to archive/asserted_by_archived_20260114.yaml."
revision:
- label: is_or_was_asserted_by
type: slot
@@ -546,10 +566,14 @@ fixes:
- original_slot_id: https://nde.nl/ontology/hc/slot/audio_event_segments
processed:
- status: false
- timestamp: null
- session: null
- notes: "Maps to existing AudioEventSegment class"
+ status: true
+ timestamp: "2026-01-14T10:30:00Z"
+ session: "slot-migration-session-8"
+ notes: |
+ MIGRATED: audio_event_segments → has_or_had_segment + AudioEventSegment
+ - Created AudioEventSegment.yaml class (hc:AudioEventSegment)
+ - Updated VideoAudioAnnotation.yaml: imports, slots, slot_usage
+ - Archived to modules/slots/archive/audio_event_segments_archived_20260114.yaml
revision:
- label: has_or_had_segment
type: slot
@@ -570,10 +594,10 @@ fixes:
- original_slot_id: https://nde.nl/ontology/hc/slot/authors
processed:
- status: false
- timestamp: null
- session: null
- notes: "Requires Author class creation"
+ status: true
+ timestamp: '2026-01-14T15:30:00Z'
+ session: "session-2026-01-14-author-migration"
+ notes: "FULLY MIGRATED: ExhibitionCatalog.yaml - authors and has_author slots replaced with has_or_had_author (range: Author). Author class with AuthorRoleEnum created. Both authors.yaml and has_author.yaml archived."
revision:
- label: has_or_had_author
type: slot
@@ -606,10 +630,15 @@ fixes:
- original_slot_id: https://nde.nl/ontology/hc/slot/auxiliary_places
processed:
- status: false
- timestamp: null
- session: null
- notes: "Maps to existing AuxiliaryPlace class"
+ status: true
+ timestamp: '2026-01-14T11:30:00Z'
+ session: "slot-migration-session-8"
+ notes: |
+ MIGRATED: auxiliary_places → has_or_had_auxiliary_entities + AuxiliaryPlace
+ - Created has_or_had_auxiliary_entities.yaml slot
+ - AuxiliaryPlace class already existed
+ - Updated CustodianPlace.yaml: imports, slots list, slot_usage
+ - Archived to modules/slots/archive/auxiliary_places_archived_20260114.yaml
revision:
- label: has_or_had_auxiliary_entities
type: slot
@@ -630,10 +659,15 @@ fixes:
- original_slot_id: https://nde.nl/ontology/hc/slot/auxiliary_platforms
processed:
- status: false
- timestamp: null
- session: null
- notes: "Maps to existing AuxiliaryPlatform class"
+ status: true
+ timestamp: '2026-01-14T11:45:00Z'
+ session: "slot-migration-session-8"
+ notes: |
+ MIGRATED: auxiliary_platforms → has_or_had_auxiliary_entities + AuxiliaryDigitalPlatform
+ - has_or_had_auxiliary_entities slot created earlier this session
+ - AuxiliaryDigitalPlatform class already existed
+ - Updated DigitalPlatform.yaml: imports, slots list, slot_usage
+ - Archived to modules/slots/archive/auxiliary_platforms_archived_20260114.yaml
revision:
- label: has_or_had_auxiliary_entities
type: slot
@@ -686,10 +720,14 @@ fixes:
- original_slot_id: https://nde.nl/ontology/hc/slot/bay_number
processed:
- status: false
- timestamp: null
- session: null
- notes: "Requires BayNumber class creation"
+ status: true
+ timestamp: "2026-01-14T10:45:00Z"
+ session: "slot-migration-session-8"
+ notes: |
+ MIGRATED: bay_number → has_or_had_identifier + BayNumber
+ - Created BayNumber.yaml class (hc:BayNumber)
+ - Updated StorageUnit.yaml: imports, slots, slot_usage
+ - Archived to modules/slots/archive/bay_number_archived_20260114.yaml
revision:
- label: has_or_had_identifier
type: slot
@@ -827,10 +865,10 @@ fixes:
- original_slot_id: https://nde.nl/ontology/hc/slot/birth_date
processed:
- status: false
- timestamp: null
- session: null
- notes: "Requires BirthDate class creation"
+ status: true
+ timestamp: '2026-01-14T16:00:00Z'
+ session: "session-2026-01-14-birth-date-migration"
+ notes: "FULLY MIGRATED: PersonObservation.yaml - birth_date replaced with has_or_had_date_of_birth (range: BirthDate). BirthDate class created with EDTF support, confidence enum, and inference provenance. birth_date.yaml archived."
revision:
- label: has_or_had_date_of_birth
type: slot
@@ -839,10 +877,10 @@ fixes:
- original_slot_id: https://nde.nl/ontology/hc/slot/birth_place
processed:
- status: false
- timestamp: null
- session: null
- notes: "Requires BirthPlace class creation"
+ status: true
+ timestamp: '2026-01-14T16:15:00Z'
+ session: "session-2026-01-14-birth-place-migration"
+ notes: "FULLY MIGRATED: PersonObservation.yaml - birth_place replaced with has_or_had_place_of_birth (range: BirthPlace). BirthPlace class created with historical/modern place names, GeoNames/Wikidata integration. birth_place.yaml archived."
revision:
- label: has_or_had_place_of_birth
type: slot
@@ -939,10 +977,14 @@ fixes:
- original_slot_id: https://nde.nl/ontology/hc/slot/box_number
processed:
- status: false
- timestamp: null
- session: null
- notes: "Requires BoxNumber class creation"
+ status: true
+ timestamp: "2026-01-14T10:45:00Z"
+ session: "slot-migration-session-8"
+ notes: |
+ MIGRATED: box_number → has_or_had_identifier + BoxNumber
+ - Created BoxNumber.yaml class (hc:BoxNumber)
+ - Updated StorageUnit.yaml: imports, slots, slot_usage
+ - Archived to modules/slots/archive/box_number_archived_20260114.yaml
revision:
- label: has_or_had_identifier
type: slot
@@ -1035,10 +1077,10 @@ fixes:
- original_slot_id: https://nde.nl/ontology/hc/slot/branch_service_area
processed:
- status: false
- timestamp: null
- session: null
- notes: "Requires ServiceArea class creation"
+ status: true
+ timestamp: "2026-01-14T12:30:00Z"
+ session: "slot-migration-session-20260114"
+ notes: "COMPLETED: Created has_or_had_service_area slot with range ServiceArea. Updated BranchOffice.yaml imports, slots list, slot_usage, and examples. ServiceArea class already existed with full geographic modeling. Archived branch_service_area to archive/branch_service_area_archived_20260114.yaml"
revision:
- label: has_or_had_service_area
type: slot
@@ -1047,10 +1089,10 @@ fixes:
- original_slot_id: https://nde.nl/ontology/hc/slot/branch_staff_count
processed:
- status: false
- timestamp: null
- session: null
- notes: "Maps to existing Quantity class"
+ status: true
+ timestamp: '2026-01-14T23:35:00Z'
+ session: "session-2026-01-14-slot-migrations"
+ notes: "FULLY MIGRATED: Created has_or_had_quantity slot, Quantity class, and QuantityTypeEnum. BranchOffice.yaml updated with new imports, slots, and slot_usage. Old branch_staff_count slot archived to archive/branch_staff_count_archived_20260114.yaml. Quantity class supports staff counts, collection sizes, visitor counts, budget amounts, etc."
revision:
- label: has_or_had_quantity
type: slot
@@ -1177,10 +1219,14 @@ fixes:
- original_slot_id: https://nde.nl/ontology/hc/slot/budget_status
processed:
- status: false
- timestamp: null
- session: null
- notes: "Requires BudgetStatus class creation"
+ status: true
+ timestamp: '2026-01-14T11:00:00Z'
+ session: "slot-migration-session-8"
+ notes: |
+ MIGRATED: budget_status → has_or_had_status + BudgetStatus
+ - Created BudgetStatus.yaml class (hc:BudgetStatus)
+ - Updated Budget.yaml: imports, slots list, slot_usage, examples
+ - Archived to modules/slots/archive/budget_status_archived_20260114.yaml
revision:
- label: has_or_had_status
type: slot
@@ -2128,7 +2174,53 @@ fixes:
type: slot
- label: ApprovalTimeTypes
type: class
-
-
-
-
+ - original_slot_id: https://nde.nl/ontology/hc/slot/type_status
+ revision:
+ - label: has_or_had_status
+ type: slot
+ - label: TypeStatus
+ type: class
+ - original_slot_id: https://nde.nl/ontology/hc/slot/type_scope
+ revision:
+ - label: has_or_had_scope
+ type: slot
+ - label: Scope
+ type: class
+ - label: has_or_had_type
+ type: slot
+ - label: ScopeType
+ type: class
+ - label: includes_or_included
+ type: slot
+ - label: ScopeTypes
+ type: class
+ - original_slot_id: https://nde.nl/ontology/hc/slot/type_label
+ revision:
+ - label: has_or_had_label
+ type: slot
+ - label: Label
+ type: class
+ - label: has_or_had_language
+ type: slot
+ - label: Language
+ type: class
+ - label: has_or_had_identifier
+ type: slot
+ - label: ISO639-3Identifier
+ type: class
+ - original_slot_id: https://nde.nl/ontology/hc/slot/type_id
+ revision:
+ - label: has_or_had_identifier
+ type: slot
+ - label: Identifier
+ type: class
+ - original_slot_id: https://nde.nl/ontology/hc/slot/type_hypothesis
+ revision:
+ - label: has_or_had_provenance
+ type: slot
+ - label: Provenance
+ type: class
+ - label: asserts_or_asserted
+ type: slot
+ - label: Hypothesis
+ type: class
\ No newline at end of file
diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/was_approved_by.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/was_approved_by.yaml
deleted file mode 100644
index 6e3512ab25..0000000000
--- a/frontend/public/schemas/20251121/linkml/modules/slots/was_approved_by.yaml
+++ /dev/null
@@ -1,41 +0,0 @@
-id: https://nde.nl/ontology/hc/slot/was_approved_by
-name: was_approved_by_slot
-title: Was Approved By Slot
-prefixes:
- dcterms: http://purl.org/dc/terms/
- hc: https://nde.nl/ontology/hc/
- linkml: https://w3id.org/linkml/
- prov: http://www.w3.org/ns/prov#
- schema: http://schema.org/
-imports:
-- linkml:types
-default_prefix: hc
-slots:
- was_approved_by:
- description: 'Governance body or authority that approved budget.
-
-
- **Examples**:
-
- - "Board of Directors"
-
- - "Executive Committee"
-
- - "Ministry of Culture"
-
- - "City Council"
-
- '
- range: string
- slot_uri: prov:wasAttributedTo
- exact_mappings:
- - prov:wasAttributedTo
- close_mappings:
- - dcterms:creator
- - prov:wasInfluencedBy
- annotations:
- custodian_types: '["*"]'
- custodian_types_rationale: Applicable to all heritage custodian types.
- custodian_types_primary: M
- specificity_score: 0.5
- specificity_rationale: Moderately specific slot.
diff --git a/frontend/src/pages/EntityReviewPage.tsx b/frontend/src/pages/EntityReviewPage.tsx
index 4ff6af359d..4e80421c0c 100644
--- a/frontend/src/pages/EntityReviewPage.tsx
+++ b/frontend/src/pages/EntityReviewPage.tsx
@@ -1145,6 +1145,36 @@ export default function EntityReviewPage() {
{language === 'nl' ? 'of voeg handmatig toe' : 'or add manually'}
+