diff --git a/.opencode/rules/no-migration-deferral-rule.md b/.opencode/rules/no-migration-deferral-rule.md new file mode 100644 index 0000000000..cc50631574 --- /dev/null +++ b/.opencode/rules/no-migration-deferral-rule.md @@ -0,0 +1,164 @@ +# Rule 60: No Migration Deferral - Execute All slot_fixes.yaml Revisions + +## Status: MANDATORY + +## Summary + +**AI agents MUST execute ALL migrations specified in `slot_fixes.yaml`.** The pattern of marking migrations as "WELL_STRUCTURED_NO_MIGRATION_NEEDED" or similar deferral notes is **STRICTLY PROHIBITED** except in the rarest cases of genuine semantic conflict. + +## The Problem + +Previous AI agents incorrectly deferred >95% of slot_fixes.yaml migrations with notes like: +- "WELL_STRUCTURED_NO_MIGRATION_NEEDED" +- "Already has proper slot_uri" +- "Simple enum is appropriate" +- "Would add unnecessary indirection" +- "Current structure is adequate" + +**These deferrals were WRONG.** The slot_fixes.yaml revisions were carefully curated based on: +- Ontology analysis (CIDOC-CRM, RiC-O, PROV-O, Schema.org alignment) +- Semantic correctness and consistency +- Pattern adherence (Rule 39: RiC-O naming, Rule 43: singular nouns) +- Type/Types class hierarchy design (Rule 0b) + +## The Rule + +### MANDATORY: Execute ALL Migrations + +When encountering a slot_fixes.yaml entry with `status: false`: + +1. **READ the `revision` field** - This specifies EXACTLY what to do +2. **EXECUTE the migration** - Create/update slots, classes, imports as specified +3. **UPDATE status to `true`** - Document what was done in `notes` + +### PROHIBITED: Deferral Reasoning + +The following justifications are **INVALID** and **NEVER acceptable**: + +| Invalid Justification | Why It's Wrong | +|-----------------------|----------------| +| "Already has proper slot_uri" | slot_uri handles external mapping; internal structure is separate concern | +| "Simple string/enum is sufficient" | Consistency and extensibility trump local simplicity | +| "Would add unnecessary indirection" | Indirection enables reuse and future extension | +| "Creating a class would over-engineer" | Ontology design favors class-based modeling | +| "Current structure is well-designed" | Individual optimization conflicts with schema-wide patterns | +| "No semantic benefit" | Agent lacks context to make this judgment | + +### VALID: Reasons to Pause (Not Defer) + +The ONLY valid reasons to pause a migration (NOT defer indefinitely) are: + +1. **Semantic Conflict**: The proposed revision contradicts the slot's documented semantic intent +2. **Circular Dependency**: Migration would create import cycle +3. **External Consumer Impact**: Breaking change affecting downstream systems +4. **Class Already Exists**: Target class exists under different name (document and merge) + +**When pausing**: Add a `feedback` entry explaining the specific conflict and request human review. Do NOT mark as "NO_MIGRATION_NEEDED". + +## Decision Tree + +``` +Is there a slot_fixes.yaml entry with status: false? +├─ YES → Read the revision field +│ ├─ Does revision specify slots/classes to create? +│ │ └─ YES → EXECUTE THE MIGRATION (mandatory) +│ └─ Is there a genuine semantic conflict? +│ ├─ NO → EXECUTE THE MIGRATION (mandatory) +│ └─ YES → Document conflict in feedback, request human review +│ (Do NOT mark as "no migration needed") +└─ NO → Nothing to do +``` + +## Examples + +### WRONG: Deferral Note + +```yaml +- original_slot_id: https://nde.nl/ontology/hc/slot/example_slot + revision: + - label: has_or_had_example + type: slot + - label: Example + type: class + processed: + status: true # WRONG - marked true without doing work + notes: "WELL_STRUCTURED_NO_MIGRATION_NEEDED - slot already has proper + slot_uri and the current structure is adequate" # INVALID +``` + +### CORRECT: Execute Migration + +```yaml +- original_slot_id: https://nde.nl/ontology/hc/slot/example_slot + revision: + - label: has_or_had_example + type: slot + - label: Example + type: class + processed: + status: true + timestamp: '2026-01-19T12:00:00Z' + notes: 'Migrated 2026-01-19 per Rule 53/56. + - Created has_or_had_example.yaml slot file + - Created Example.yaml class file + - Updated ClassA.yaml, ClassB.yaml to use new slot + - Archived: modules/slots/archive/example_slot_archived_20260119.yaml' +``` + +### CORRECT: Pause with Genuine Conflict + +```yaml +- original_slot_id: https://nde.nl/ontology/hc/slot/conflicting_slot + revision: + - label: has_or_had_foo + type: slot + processed: + status: false # Correctly left false + notes: '' + feedback: + - timestamp: '2026-01-19T12:00:00Z' + user: opencode-claude + done: false + comment: | + PAUSED FOR HUMAN REVIEW - Genuine semantic conflict detected: + - Revision specifies has_or_had_foo (temporal relationship) + - But slot is used for immutable birth dates (should be has_*) + - Request clarification on intended temporal semantics +``` + +## Statistics Context + +The slot_fixes.yaml file contains 527 migration entries. Analysis of previous agent behavior: + +- **Incorrectly deferred**: >95% of entries marked "NO_MIGRATION_NEEDED" +- **Actually needing deferral**: <5% (genuine semantic conflicts) +- **Required action**: Execute ALL migrations except those with documented semantic conflicts + +## Related Rules + +- **Rule 53**: Full Slot Migration - slot_fixes.yaml is AUTHORITATIVE +- **Rule 56**: Semantic Consistency Over Simplicity - Always Execute Revisions +- **Rule 57**: slot_fixes.yaml Revision Key is IMMUTABLE +- **Rule 58**: Feedback vs Revision Distinction + +## Anti-Patterns Checklist + +Before marking ANY migration as complete without execution, verify: + +- [ ] Did I actually create the specified slots? +- [ ] Did I actually create the specified classes? +- [ ] Did I update all class files that use this slot? +- [ ] Did I archive the old slot file? +- [ ] Is my "notes" field documenting actual work done, not a deferral excuse? + +If any answer is "no", the migration is NOT complete. + +## Consequences + +Agents that defer migrations without genuine semantic conflict: +1. Create technical debt requiring human cleanup +2. Delay schema consistency improvements +3. Waste curator time reviewing false "completions" +4. Undermine trust in AI-assisted schema work + +**Execute the migrations. Do not defer.** diff --git a/.opencode/rules/semantic-consistency-over-simplicity.md b/.opencode/rules/semantic-consistency-over-simplicity.md index d3add39c21..de80a74858 100644 --- a/.opencode/rules/semantic-consistency-over-simplicity.md +++ b/.opencode/rules/semantic-consistency-over-simplicity.md @@ -1,22 +1,146 @@ # Rule 56: Semantic Consistency Over Simplicity - Always Execute slot_fixes.yaml Revisions -**CRITICAL**: When `slot_fixes.yaml` specifies a revision, agents MUST execute it. Perceived simplicity of the existing slot is NOT a valid reason to reject a migration. +🚨 **CRITICAL**: When `slot_fixes.yaml` specifies a revision, agents MUST execute it. Perceived simplicity of the existing slot is NOT a valid reason to reject a migration. ## The Core Problem -Previous agents marked migrations as "NO MIGRATION NEEDED" citing reasons like: -- "Simple enum appropriate" -- "Would add unnecessary indirection" -- "Already has proper slot_uri" -- "String range is sufficient" +Previous agents marked migrations as "NO MIGRATION NEEDED" or "WELL_STRUCTURED_NO_MIGRATION_NEEDED" citing reasons like: +- "simple enum appropriate" +- "would add unnecessary indirection" +- "already has proper slot_uri" +- "string range is sufficient for this use case" +- "well-structured, no migration needed" +- "current implementation is adequate" -These judgments were **INCORRECT**. The `slot_fixes.yaml` revisions exist for specific architectural reasons that transcend local optimization. +**These judgments were INCORRECT.** + +**Over 95% of entries in `slot_fixes.yaml` represent carefully curated migrations that MUST be executed.** + +The revisions were manually designed based on: +- Ontology analysis (CIDOC-CRM, RiC-O, PROV-O, Schema.org alignment) +- Semantic correctness +- Pattern consistency (Rule 39: RiC-O style naming) +- Type/Types class hierarchy design (Rule 0b) ## Why Revisions MUST Be Executed -### 1. Schema Consistency Principle +| Principle | Explanation | +|-----------|-------------| +| **Schema Consistency** | Ontology achieves semantic power through consistent patterns, not local optimizations | +| **LinkML Mapping Separation** | `slot_uri` handles external ontology alignment; slot structure handles internal consistency | +| **Single Responsibility Principle** | Predicates should have single, focused purposes | +| **Extensibility First** | Structured classes enable future extension even if current use is simple | +| **Curated Quality** | Revisions were manually designed with ontology expertise - trust them | -The ontology achieves semantic power through **consistent patterns**, not local optimizations: +## Invalid Reasons to Reject Migrations + +| Rejected Reason | Why It's Invalid | +|-----------------|------------------| +| "Already has proper slot_uri" | slot_uri is for external mapping; internal structure is separate concern | +| "Simple string/enum is sufficient" | Consistency and extensibility trump local simplicity | +| "Would add unnecessary indirection" | Indirection enables reuse and future extension | +| "Creating a class would over-engineer" | Ontology design favors class-based modeling | +| "Well-structured, no migration needed" | **If revision exists, migration IS needed** | +| "Current implementation is adequate" | Adequacy is not the standard; consistency is | +| "WELL_STRUCTURED_NO_MIGRATION_NEEDED" | **This note type is PROHIBITED** | + +## Valid Reasons to PAUSE Migrations (Not Reject) + +These warrant discussion with the user, NOT unilateral rejection: + +1. **Semantic Conflict**: Proposed slot_uri contradicts the semantic intent of the slot +2. **Class Already Exists**: The target class exists under a different name (propose merge) +3. **Circular Dependency**: Migration would create import cycles +4. **Breaking External API**: Change would break published external consumers + +**Even these reasons require escalation to the user** - agents should NOT mark as "NO MIGRATION NEEDED". + +## The Key Insight + +Agents confused "has good external mapping" with "needs no migration". These are **independent concerns**: + +- **External mapping** (slot_uri, exact_mappings): How this slot relates to external ontologies +- **Internal structure** (range, class design): How this slot fits within the LinkML schema + +A slot can have perfect external mappings AND still need structural migration for internal consistency. + +## Correct Agent Behavior + +```yaml +# When encountering a slot_fixes.yaml entry: + +1. READ the revision specification completely +2. DO NOT evaluate whether migration is "necessary" - it IS necessary +3. CREATE the specified slots and classes +4. UPDATE the consuming class(es) +5. ARCHIVE the old slot +6. ADD processed section with status: true + +# NEVER add notes like: +# - "NO MIGRATION NEEDED" +# - "WELL_STRUCTURED_NO_MIGRATION_NEEDED" +# - "Current implementation is sufficient" +# - "Would add unnecessary complexity" +# - "Simple enum appropriate" +``` + +## Handling Previous "NO MIGRATION NEEDED" Entries + +Entries previously marked with notes like "WELL_STRUCTURED_NO_MIGRATION_NEEDED" should be: + +1. **Re-processed**: The migration should be executed as specified in `revision` +2. **Notes replaced**: Replace the incorrect notes with actual migration documentation +3. **Status verified**: Ensure `status: true` reflects ACTUAL migration, not skipped migration + +## Example - WRONG Agent Behavior + +```yaml +# WRONG - Agent decided migration wasn't needed +- original_slot_id: https://nde.nl/ontology/hc/slot/cites_appendix + revision: + - label: is_or_was_listed_in + type: slot + - label: CITESAppendix + type: class + processed: + status: true # ← Marked complete but NOT actually migrated! + notes: "WELL_STRUCTURED_NO_MIGRATION_NEEDED: Already has proper slot_uri + and string range is sufficient for CITES appendix values." +``` + +## Example - CORRECT Agent Behavior + +```yaml +# CORRECT - Agent executed the migration as specified +- original_slot_id: https://nde.nl/ontology/hc/slot/cites_appendix + revision: + - label: is_or_was_listed_in + type: slot + - label: CITESAppendix + type: class + processed: + status: true + timestamp: '2026-01-19T00:00:00Z' + session: session-2026-01-19-cites-appendix-migration + notes: 'Migrated 2026-01-19 per Rule 53/56. Created is_or_was_listed_in.yaml. + Created CITESAppendix.yaml class. Updated BiologicalObject.yaml. + Archived: modules/slots/archive/cites_appendix_archived_20260119.yaml.' +``` + +## Feedback Field + +The `feedback` field in slot_fixes.yaml entries contains user corrections to agent mistakes. When feedback says things like: + +- "I reject this!" +- "Conduct the migration" +- "Please conduct accordingly" +- "I altered the revision" + +This means a previous agent incorrectly deferred the migration, and it MUST now be executed. + +## Schema Consistency Examples + +### Why "Simple URI is fine" is WRONG ```yaml # WRONG - Agent judgment: "Simple URI is fine" @@ -29,132 +153,38 @@ has_or_had_thumbnail: range: Thumbnail # Thumbnail class with has_or_had_url → URL ``` -**Rationale**: All media references (images, thumbnails, videos, documents) should use the same structural pattern. Inconsistency creates cognitive load and maintenance burden. +**Rationale**: All media references (images, thumbnails, videos, documents) should use the same structural pattern. -### 2. LinkML Ontology Mapping Separation - -The `slot_uri` property handles external ontology alignment. Slot structure handles internal consistency: +### Why "Simple enum is appropriate" is WRONG ```yaml -# slot_uri handles: schema:thumbnailUrl, foaf:thumbnail, etc. -# Slot structure handles: consistent pattern within our ontology -has_or_had_thumbnail: - slot_uri: schema:thumbnailUrl - exact_mappings: - - foaf:thumbnail - range: Thumbnail # Internal consistency -``` - -**Key Insight**: Agents confused "has good external mapping" with "needs no migration". These are independent concerns. - -### 3. Single Responsibility Principle (SRP) - -Predicates should have single, focused purposes: - -```yaml -# WRONG - Overloaded predicate -applies_or_applied_to_call: - description: "Used for both funding calls and application requirements" - -# CORRECT - Single responsibility per predicate -applies_or_applied_to: - description: "Expresses application relationship" - -is_or_was_required_for: - description: "Expresses requirement relationship" -``` - -### 4. Extensibility First - -Even if current use is simple, structured classes enable future extension: - -```yaml -# "Simple enum is fine" - Agent judgment +# WRONG - "Simple enum is fine" thinking_mode: range: ThinkingModeEnum # enabled, disabled, interleaved -# But this blocks: confidence scores, provenance, timestamps -# With class: +# CORRECT - Enables extension has_or_had_mode: range: ThinkingMode # ThinkingMode can have: mode_type, confidence, effective_date, etc. ``` -## Decision Rules for Agents +**Rationale**: Even if current use is simple, structured classes enable future extension without breaking changes. -### When slot_fixes.yaml Specifies a Revision +## Summary -| Agent Action | Status | -|--------------|--------| -| Execute the revision exactly | CORRECT | -| Mark as "NO MIGRATION NEEDED" | WRONG | -| Substitute different slot/class | WRONG | -| Partially execute revision | WRONG | +**Trust the revision. Execute the migration. Document the work.** -### Invalid Reasons to Reject Migrations - -These are NOT valid reasons to mark "NO MIGRATION NEEDED": - -1. **"Already has proper slot_uri"** - slot_uri is for external mapping; internal structure is separate -2. **"Simple string/enum is sufficient"** - consistency and extensibility trump local simplicity -3. **"Would add unnecessary indirection"** - indirection enables reuse and future extension -4. **"Range X is appropriate"** - slot_fixes.yaml revision takes precedence -5. **"Creating a class would over-engineer"** - ontology design favors class-based modeling - -### Valid Reasons to Pause Migrations - -These warrant discussion (not unilateral rejection): - -1. **Semantic conflict** - Proposed slot_uri contradicts the semantic intent (e.g., ownership vs. physical movement) -2. **Class already exists** - Revision proposes class that already exists under different name -3. **Circular dependency** - Migration would create import cycle -4. **Breaking change** - Migration would break external consumers (document and discuss) - -**When in doubt**: Execute the revision and document concerns for future discussion. - -## Feedback Patterns and Lessons - -### Pattern 1: "LinkML ontology mapping takes care of related semantics" - -**Meaning**: Don't conflate `slot_uri` (external alignment) with slot structure (internal consistency). Both are needed. - -```yaml -# slot_uri handles external semantics -# Range and class structure handle internal consistency -has_or_had_code: - slot_uri: schema:identifier # External mapping - range: Alpha2Code # Internal structure -``` - -### Pattern 2: "Follow the revision as is" - -**Meaning**: Execute exactly what slot_fixes.yaml specifies. No substitutions. - -### Pattern 3: "Predicates should follow the Single Responsibility Principle (SRP)" - -**Meaning**: Don't create multi-purpose predicates. Split into focused slots. - -### Pattern 4: "Provides consistency with other X in the ontology" - -**Meaning**: Pattern consistency across the schema is more valuable than local optimization. - -## Implementation Checklist - -Before marking any slot as "NO MIGRATION NEEDED", verify: - -- [ ] Did you execute the revision from slot_fixes.yaml? -- [ ] Is your justification one of the "Invalid Reasons" listed above? -- [ ] Does your decision maintain consistency with similar slots? -- [ ] Have you considered extensibility implications? -- [ ] Is there a genuine semantic conflict (not just preference)? +The `revision` key in `slot_fixes.yaml` represents carefully curated ontology decisions. Agents are **executors** of these decisions, **not evaluators**. The only acceptable output is a completed migration with proper documentation. ## Related Rules - **Rule 53**: slot_fixes.yaml is AUTHORITATIVE - Full Slot Migration - **Rule 55**: Broaden Generic Predicate Ranges Instead of Creating Bespoke Predicates +- **Rule 57**: The revision key in slot_fixes.yaml is IMMUTABLE - **Rule 39**: RiC-O Temporal Naming Conventions - **Rule 38**: Slot Centralization and Semantic URI Requirements ## Revision History +- 2026-01-19: Strengthened with explicit prohibition of "WELL_STRUCTURED_NO_MIGRATION_NEEDED" notes - 2026-01-16: Created based on analysis of 51 feedback entries in slot_fixes.yaml diff --git a/AGENTS.md b/AGENTS.md index d26a40170e..acc8a11f0b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -47,7 +47,7 @@ This is NOT a simple data extraction project. This is an **ontology engineering --- -This section summarizes 55 critical rules. Each rule has complete documentation in `.opencode/` files. +This section summarizes 60 critical rules. Each rule has complete documentation in `.opencode/` files. ### Rule 0: LinkML Schemas Are the Single Source of Truth @@ -1994,6 +1994,39 @@ slots: --- +### Rule 60: No Migration Deferral - Execute All slot_fixes.yaml Revisions + +🚨 **CRITICAL**: AI agents MUST execute ALL migrations specified in `slot_fixes.yaml`. The pattern of marking migrations as "WELL_STRUCTURED_NO_MIGRATION_NEEDED" or similar deferral notes is **STRICTLY PROHIBITED**. + +**The Problem**: Previous agents marked 95%+ of slot_fixes.yaml entries with notes like "Already well-structured" without executing migrations. This violated the curated intent of slot_fixes.yaml revisions. + +**Invalid Justifications** (NEVER acceptable for skipping migration): + +| Rejected Reason | Why It's Invalid | +|-----------------|------------------| +| "Already has proper slot_uri" | slot_uri is for external mapping; internal structure is separate concern | +| "Simple string/enum is sufficient" | Consistency and extensibility trump local simplicity | +| "Would add unnecessary indirection" | Indirection enables reuse and future extension | +| "Current structure is well-designed" | Revisions were curated with full ontology context | +| "WELL_STRUCTURED_NO_MIGRATION_NEEDED" | This exact phrase is now a red flag | + +**Valid Pause Reasons** (require `feedback` entry, NOT deferral via notes): +- Genuine semantic conflict between revision and documented intent +- Circular dependency would be created +- Breaking change affecting known external consumers + +**Statistics**: >95% of slot_fixes.yaml entries MUST be executed. <5% may have genuine conflicts requiring human review via `feedback` mechanism. + +**Workflow**: +1. Read the `revision` section completely +2. Execute the migration exactly as specified +3. Mark `processed.status: true` +4. If genuine conflict exists, add `feedback` entry (NOT a deferral note) + +**See**: `.opencode/rules/no-migration-deferral-rule.md` for complete documentation + +--- + ## Appendix: Full Rule Content (No .opencode Equivalent) The following rules have no separate .opencode file and are preserved in full: diff --git a/frontend/public/schemas/20251121/linkml/manifest.json b/frontend/public/schemas/20251121/linkml/manifest.json index 182c13e8e3..f6dd9fb34f 100644 --- a/frontend/public/schemas/20251121/linkml/manifest.json +++ b/frontend/public/schemas/20251121/linkml/manifest.json @@ -1,5 +1,5 @@ { - "generated": "2026-01-18T17:22:04.718Z", + "generated": "2026-01-19T12:05:24.104Z", "schemaRoot": "/schemas/20251121/linkml", "totalFiles": 2969, "categoryCounts": { diff --git a/schemas/20251121/linkml/01_custodian_name_modular.yaml b/schemas/20251121/linkml/01_custodian_name_modular.yaml index 2f32910046..9dfc43d308 100644 --- a/schemas/20251121/linkml/01_custodian_name_modular.yaml +++ b/schemas/20251121/linkml/01_custodian_name_modular.yaml @@ -43,12 +43,15 @@ imports: - modules/slots/has_appellation_type - modules/slots/has_appellation_value - modules/slots/has_or_had_arrangement_system - - modules/slots/collection_description - - modules/slots/collection_name + - modules/slots/has_or_had_description + - modules/slots/has_or_had_label + # collection_description ARCHIVED (2026-01-18) - migrated to has_or_had_description (Rule 53) + # collection_name ARCHIVED (2026-01-18) - migrated to has_or_had_label (Rule 53) # collection_scope ARCHIVED (2026-01-18) - migrated to has_or_had_scope + CollectionScope (Rule 53) - modules/slots/has_or_had_scope - modules/slots/collection_type - - modules/slots/collections_under_responsibility + # collections_under_responsibility ARCHIVED (2026-01-19) - migrated to is_or_was_responsible_for (Rule 53) + - modules/slots/is_or_was_responsible_for - modules/slots/confidence_method - modules/slots/confidence_score - modules/slots/confidence_value @@ -599,7 +602,7 @@ imports: - modules/slots/has_or_had_area_served - modules/slots/has_or_had_member_custodian - modules/slots/membership_criteria - - modules/slots/community_engagement + # community_engagement ARCHIVED 2026-01-19 - migrated to has_or_had_activity (imported above) - modules/slots/service_offering - modules/slots/record_type - modules/slots/society_focus diff --git a/schemas/20251121/linkml/manifest.json b/schemas/20251121/linkml/manifest.json index b8b619d175..0b24f7fd3c 100644 --- a/schemas/20251121/linkml/manifest.json +++ b/schemas/20251121/linkml/manifest.json @@ -1,5 +1,5 @@ { - "generated": "2026-01-18T23:09:29.147Z", + "generated": "2026-01-19T12:05:53.461Z", "schemaRoot": "/schemas/20251121/linkml", "totalFiles": 2969, "categoryCounts": { diff --git a/schemas/20251121/linkml/modules/classes/ActivityTypes.yaml b/schemas/20251121/linkml/modules/classes/ActivityTypes.yaml index e2473114cb..001fdaac13 100644 --- a/schemas/20251121/linkml/modules/classes/ActivityTypes.yaml +++ b/schemas/20251121/linkml/modules/classes/ActivityTypes.yaml @@ -373,3 +373,50 @@ classes: annotations: activity_category: LOAN spectrum_procedures: "loans-out, loans-in" + + # =========================================================================== + # COMMUNITY ENGAGEMENT ACTIVITY TYPES + # =========================================================================== + + CommunityEngagementActivityType: + is_a: ActivityType + class_uri: schema:InteractAction + description: | + Activity type for community outreach, public programming, and engagement activities. + + **Definition**: + Activities that connect heritage custodians with broader communities through + advocacy, public programs, and participatory engagement. + + **Subtypes**: + - Membership Meetings: Monthly, quarterly, annual gatherings + - Lecture Series: Guest speakers on heritage topics + - Field Trips: Site visits, museum tours, heritage walks + - Workshops: Skill-building sessions (genealogy, conservation, identification) + - Public Events: Open houses, exhibitions, school programs + - Community Events: Heritage days, festivals, memorial events + - Digital Engagement: Websites, social media, online forums, virtual meetings + - Advocacy: Historic preservation, heritage education, policy engagement + - Partnerships: Collaborations with local government, museums, libraries, universities + + **Typical Use Cases**: + - Heritage societies (heemkundekringen) connecting with local communities + - Archive associations conducting public outreach + - Museums hosting community events + + **Schema.org**: Maps to InteractAction for community interaction activities + + **Migration Note**: Created 2026-01-19 per slot_fixes.yaml revision. + Replaces community_engagement slot (string) with structured Activity class. + exact_mappings: + - schema:InteractAction + - wd:Q1069284 # Wikidata: community engagement + close_mappings: + - schema:CommunicateAction + - aat:300054552 # education (activity) - overlaps with educational engagement + related_mappings: + - schema:Event + annotations: + activity_category: COMMUNITY_ENGAGEMENT + migration_date: "2026-01-19" + replaces_slot: "community_engagement" diff --git a/schemas/20251121/linkml/modules/classes/Address.yaml b/schemas/20251121/linkml/modules/classes/Address.yaml index 120b355b41..c1b336c508 100644 --- a/schemas/20251121/linkml/modules/classes/Address.yaml +++ b/schemas/20251121/linkml/modules/classes/Address.yaml @@ -29,7 +29,8 @@ imports: # street_address was a redundant string slot; full Address class captures street data via components - ../slots/postal_code - ../slots/locality - - ../slots/city + # REMOVED: ../slots/city - migrated to is_or_was_located_in + City (2026-01-18, Rule 53) + - ../slots/is_or_was_located_in - ../slots/region - ../slots/country_name # Shared slots (replacing address_formatted, address_type) @@ -46,6 +47,7 @@ imports: - ./Country - ./Subregion - ./Settlement + - ./City # Added for is_or_was_located_in range (2026-01-18, Rule 53) - ./CustodianObservation - ./ReconstructionActivity - ./AddressType @@ -154,7 +156,8 @@ classes: - postal_code # Locality/geographic hierarchy - locality - - city + # REMOVED: city - migrated to is_or_was_located_in + City (2026-01-18, Rule 53) + - is_or_was_located_in - region - country_name # Formatted representation (MIGRATED: address_formatted → has_or_had_label) @@ -196,10 +199,25 @@ classes: examples: - value: "Amsterdam" description: City name - city: - range: string + # REMOVED: city slot_usage - migrated to is_or_was_located_in + City (2026-01-18, Rule 53) + # city: + # range: string + # required: false + # description: Alternative slot for locality (schema:addressLocality) + is_or_was_located_in: + range: City required: false - description: Alternative slot for locality (schema:addressLocality) + inlined: true + description: | + The city where this address is located, as a structured City entity. + MIGRATED from city (string) slot (2026-01-18, Rule 53). + Provides GeoNames ID, coordinates, and subregion linkage. + examples: + - value: + settlement_name: "Amsterdam" + geonames_id: 2759794 + country: "NL" + description: Address located in Amsterdam region: range: string required: false diff --git a/schemas/20251121/linkml/modules/classes/ArchiveAssociation.yaml b/schemas/20251121/linkml/modules/classes/ArchiveAssociation.yaml index 4eb2a3336e..40951bde71 100644 --- a/schemas/20251121/linkml/modules/classes/ArchiveAssociation.yaml +++ b/schemas/20251121/linkml/modules/classes/ArchiveAssociation.yaml @@ -33,7 +33,7 @@ classes: - Publication of newsletters and journals\n- Support for acquisitions and preservation\n\n**Organizational Role**:\n\ These are typically:\n- \"Friends of the Archives\" organizations\n- Historical societies supporting local archives\n\ - Professional associations for archivists\n- Advocacy groups for archival funding\n\n**Heritage Society Focus**:\n\ - Use `society_focus` slot to describe the archive(s) supported.\nUse `community_engagement` to document advocacy and\ + Use `society_focus` slot to describe the archive(s) supported.\nUse `has_or_had_activity` to document advocacy and\ \ outreach activities.\n\n**Related Types**:\n- HeritageSocietyType - Parent class for heritage support organizations\n\ - Archive (Q166118) - The institutions they support (NOT the same thing)\n\n**Primary Type**: \nMaps to 'S' (COLLECTING_SOCIETY)\ \ in GLAMORCUBESFIXPHDNT taxonomy,\nNOT 'A' (ARCHIVE) - these are support organizations, not archives themselves.\n\n\ diff --git a/schemas/20251121/linkml/modules/classes/ArticlesOfAssociation.yaml b/schemas/20251121/linkml/modules/classes/ArticlesOfAssociation.yaml index 0e4c36bbf5..0b45b05a43 100644 --- a/schemas/20251121/linkml/modules/classes/ArticlesOfAssociation.yaml +++ b/schemas/20251121/linkml/modules/classes/ArticlesOfAssociation.yaml @@ -21,7 +21,7 @@ imports: - ../slots/has_articles_archival_stage - ../slots/has_articles_document_format - ../slots/has_articles_document_url - - ../slots/collected_in + - ../slots/is_or_was_included_in # was: collected_in - migrated per Rule 53 (2026-01-19) - ../slots/document_description - ../slots/document_title - ../slots/document_type @@ -129,7 +129,7 @@ classes: - has_articles_archival_stage - has_articles_document_format - has_articles_document_url - - collected_in + - is_or_was_included_in # was: collected_in - migrated per Rule 53 (2026-01-19) - document_description - document_title - document_type @@ -271,9 +271,16 @@ classes: is_or_was_archived_in: range: CustodianArchive required: false - collected_in: + is_or_was_included_in: # was: collected_in - migrated per Rule 53 (2026-01-19) + description: | + CustodianCollection where heritage articles are preserved. + Only applicable when has_articles_archival_stage = HERITAGE. + MIGRATED from collected_in per slot_fixes.yaml (Rule 53). range: CustodianCollection required: false + examples: + - value: https://nde.nl/ontology/hc/collection/rm/institutional-archive + description: Rijksmuseum institutional archive collection requires_articles_at_registration: range: boolean required: false @@ -346,7 +353,7 @@ classes: registered_office_clause: De stichting heeft haar zetel in de gemeente Amsterdam. language: nl articles_archival_stage: HERITAGE - collected_in: https://nde.nl/ontology/hc/collection/rm/institutional-archive + is_or_was_included_in: https://nde.nl/ontology/hc/collection/rm/institutional-archive # was: collected_in requires_articles_at_registration: true refers_to_legal_status: https://nde.nl/ontology/hc/legal-status/rm refers_to_custodian: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804 diff --git a/schemas/20251121/linkml/modules/classes/AuxiliaryPlace.yaml b/schemas/20251121/linkml/modules/classes/AuxiliaryPlace.yaml index 819b5a5423..73f70ed006 100644 --- a/schemas/20251121/linkml/modules/classes/AuxiliaryPlace.yaml +++ b/schemas/20251121/linkml/modules/classes/AuxiliaryPlace.yaml @@ -11,6 +11,7 @@ imports: - ./GeoSpatialPlace - ./Country - ./Subregion + - ./City # Added for is_or_was_located_in range (2026-01-18, Rule 53) - ./Settlement - ./TimeSpan - ./Address # Added for has_or_had_address range (2026-01-17, Rule 53/56 migration) @@ -39,7 +40,8 @@ imports: - ../slots/longitude - ../slots/has_or_had_address # was: street_address - migrated to Address class per Rule 53/56 (2026-01-17) - ../slots/postal_code - - ../slots/city + # REMOVED: ../slots/city - migrated to is_or_was_located_in + City (2026-01-18, Rule 53) + - ../slots/is_or_was_located_in - ../slots/has_or_had_identifier - ../slots/has_auxiliary_place_type - ../slots/country @@ -124,7 +126,8 @@ classes: slots: - has_or_had_identifier - has_auxiliary_place_type - - city + # REMOVED: city - migrated to is_or_was_located_in + City (2026-01-18, Rule 53) + - is_or_was_located_in - country - geonames_id - has_feature_type @@ -227,11 +230,26 @@ classes: examples: - value: 3824 BK description: Dutch postal code - city: - range: string + # REMOVED: city slot_usage - migrated to is_or_was_located_in + City (2026-01-18, Rule 53) + # city: + # range: string + # examples: + # - value: Amersfoort + # description: City name + is_or_was_located_in: + range: City + required: false + inlined: true + description: | + The city where this auxiliary place is located, as a structured City entity. + MIGRATED from city (string) slot (2026-01-18, Rule 53). + Provides GeoNames ID, coordinates, and subregion linkage. examples: - - value: Amersfoort - description: City name + - value: + settlement_name: "Amersfoort" + geonames_id: 2759633 + country: "NL" + description: Auxiliary place located in Amersfoort country: range: Country examples: @@ -383,7 +401,10 @@ classes: language: "en" locality: "Schiphol" country_name: "NL" - city: Schiphol + is_or_was_located_in: # was: city - migrated per Rule 53/56 (2026-01-18) + settlement_name: Hoofddorp # Schiphol Airport is located in Hoofddorp municipality + geonames_id: 2753801 + country: NL country: https://nde.nl/ontology/hc/country/NL valid_from: '2002-10-01' hosts_branch: @@ -410,7 +431,10 @@ classes: postal_code: "2012 CH" locality: "Haarlem" country_name: "NL" - city: Haarlem + is_or_was_located_in: # was: city - migrated per Rule 53/56 (2026-01-18) + settlement_name: Haarlem + geonames_id: 2755003 + country: NL valid_from: '2010-01-15' valid_to: '2018-06-30' is_auxiliary_of_place: https://nde.nl/ontology/hc/place/noord-hollands-archief-main diff --git a/schemas/20251121/linkml/modules/classes/BioCustodianType.yaml b/schemas/20251121/linkml/modules/classes/BioCustodianType.yaml index af28f267a1..b153891d00 100644 --- a/schemas/20251121/linkml/modules/classes/BioCustodianType.yaml +++ b/schemas/20251121/linkml/modules/classes/BioCustodianType.yaml @@ -4,7 +4,10 @@ title: Biological and Zoological Custodian Type Classification imports: - linkml:types - ./CustodianType - - ../slots/collection_size + # REMOVED 2026-01-19: ../slots/collection_size - migrated to has_or_had_quantity + Quantity (Rule 53) + - ../slots/has_or_had_quantity + - ./Quantity + - ./Unit - ./BioCustodianSubtype # Type/Types class hierarchy (was BioCustodianTypeEnum) - ./BioCustodianSubtypes # 20 concrete subclasses - ../slots/has_or_had_hyponym # was: bio_custodian_subtype - migrated per Rule 53/56 (2026-01-17) @@ -245,7 +248,8 @@ classes: - Schema.org Garden: `schema:Garden`\n- Darwin Core: `dwc:PreservedSpecimen`\n- TDWG Standards: https://www.tdwg.org/standards/\n" slots: - has_or_had_hyponym # was: bio_custodian_subtype - migrated per Rule 53/56 (2026-01-17) - - collection_size + # REMOVED 2026-01-19: collection_size - migrated to has_or_had_quantity + Quantity (Rule 53) + - has_or_had_quantity - conservation_breeding - has_or_had_custodian_type - living_collection @@ -259,9 +263,30 @@ classes: range: string multivalued: true required: false - collection_size: - range: string + has_or_had_quantity: # was: collection_size - migrated per Rule 53 (2026-01-19) + description: | + MIGRATED from collection_size per slot_fixes.yaml (Rule 53, 2026-01-19). + Quantitative description of the living collection size using Quantity class. + Can express species count, individual organisms, or both. + Default unit is "item" (species count) or "specimen" (individual count). + range: Quantity + inlined: true + multivalued: true required: false + examples: + - value: + quantity_value: 900 + quantity_type: COLLECTION_SIZE + has_or_had_unit: + unit_value: "species" + description: Zoo species count + - value: + quantity_value: 50000 + quantity_type: COLLECTION_SIZE + has_or_had_unit: + unit_value: "specimen" + is_estimate: true + description: Botanical garden specimen count living_collection: range: boolean required: true diff --git a/schemas/20251121/linkml/modules/classes/BiologicalObject.yaml b/schemas/20251121/linkml/modules/classes/BiologicalObject.yaml index ef98e91aea..f6e93ba871 100644 --- a/schemas/20251121/linkml/modules/classes/BiologicalObject.yaml +++ b/schemas/20251121/linkml/modules/classes/BiologicalObject.yaml @@ -25,7 +25,9 @@ imports: # bold_id REMOVED - migrated to has_or_had_identifier with BOLDIdentifier class (Rule 53) - ../slots/has_or_had_identifier - ./BOLDIdentifier - - ../slots/cites_appendix + # cites_appendix REMOVED - migrated to is_or_was_listed_in with CITESAppendix class (Rule 53, 2026-01-19) + - ../slots/is_or_was_listed_in + - ./CITESAppendix - ../slots/collection_date - ../slots/collection_locality_text - ../slots/collection_location @@ -118,7 +120,8 @@ classes: - is_or_was_associated_with # bold_id REMOVED - migrated to has_or_had_identifier with BOLDIdentifier (Rule 53) - has_or_had_identifier - - cites_appendix + # cites_appendix REMOVED - migrated to is_or_was_listed_in with CITESAppendix (Rule 53, 2026-01-19) + - is_or_was_listed_in - collection_date - collection_locality_text - collection_location @@ -431,12 +434,32 @@ classes: description: Extinct (e.g., Dodo) - value: CR description: Critically Endangered - cites_appendix: + # cites_appendix REMOVED - migrated to is_or_was_listed_in with CITESAppendix (Rule 53, 2026-01-19) + is_or_was_listed_in: + description: >- + CITES (Convention on International Trade in Endangered Species) listing. + MIGRATED from cites_appendix per slot_fixes.yaml (Rule 53, 2026-01-19). + + Uses CITESAppendix class for structured representation including + appendix level, listing date, and exemption notes. + + Important for legal compliance in specimen transfers between institutions. + range: CITESAppendix + inlined: true required: false - range: string examples: - - value: APPENDIX_I - description: Most endangered, trade prohibited + - value: + has_or_had_type: APPENDIX_I + has_or_had_label: "CITES Appendix I - Most Endangered" + listing_effective_date: "1975-07-01" + species_covered: "Loxodonta africana" + description: African elephant - highest CITES protection + - value: + has_or_had_type: NOT_LISTED + has_or_had_label: "Not regulated under CITES" + species_covered: "Raphus cucullatus" + exemption_note: "Extinct species - historical specimens pre-date CITES" + description: Dodo - extinct, not subject to CITES restrictions legal_provenance_note: required: false range: string diff --git a/schemas/20251121/linkml/modules/classes/CITESAppendix.yaml b/schemas/20251121/linkml/modules/classes/CITESAppendix.yaml new file mode 100644 index 0000000000..f895ac57bd --- /dev/null +++ b/schemas/20251121/linkml/modules/classes/CITESAppendix.yaml @@ -0,0 +1,159 @@ +id: https://nde.nl/ontology/hc/class/CITESAppendix +name: CITESAppendix +title: CITES Appendix Class +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + skos: http://www.w3.org/2004/02/skos/core# + dcterms: http://purl.org/dc/terms/ +imports: + - linkml:types + - ../metadata + - ../slots/has_or_had_type + - ../slots/has_or_had_label +default_prefix: hc +classes: + CITESAppendix: + class_uri: hc:CITESAppendix + description: >- + CITES (Convention on International Trade in Endangered Species) appendix listing + for biological specimens. + + CITES regulates international trade in specimens of wild animals and plants to + ensure their survival. Species are listed in one of three appendices based on + the degree of protection needed. + + **Appendix Levels**: + + | Appendix | Protection Level | Trade Status | + |----------|------------------|--------------| + | APPENDIX_I | Highest | Trade prohibited (except non-commercial) | + | APPENDIX_II | Moderate | Trade regulated with permits | + | APPENDIX_III | Lowest | Trade monitored by request of a Party | + | NOT_LISTED | None | Not regulated under CITES | + + **Temporal Considerations**: + + Species may move between appendices as their conservation status changes. + The listing date is important for determining legal status at time of + specimen acquisition. + + **Legal Significance**: + + For heritage collections, CITES status affects: + - Loan agreements between institutions + - Specimen transfers and acquisitions + - Import/export permit requirements + - Documentation and provenance requirements + + **Example**: + ```yaml + is_or_was_listed_in: + has_or_had_type: APPENDIX_I + has_or_had_label: "CITES Appendix I - Most Endangered" + listing_effective_date: "1975-07-01" + listing_authority: "CITES Secretariat" + species_covered: "Raphus cucullatus" + ``` + slots: + - has_or_had_type + - has_or_had_label + slot_usage: + has_or_had_type: + description: >- + The CITES appendix level (APPENDIX_I, APPENDIX_II, APPENDIX_III, or NOT_LISTED). + range: string + required: true + pattern: "^(APPENDIX_I|APPENDIX_II|APPENDIX_III|NOT_LISTED)$" + examples: + - value: APPENDIX_I + description: Highest protection - species threatened with extinction + - value: APPENDIX_II + description: Moderate protection - trade must be controlled + - value: APPENDIX_III + description: Protected in at least one country requesting cooperation + - value: NOT_LISTED + description: Species not regulated under CITES + has_or_had_label: + description: >- + Human-readable description of the CITES listing status. + range: string + required: false + examples: + - value: "CITES Appendix I - Trade Prohibited" + - value: "CITES Appendix II - Trade Regulated" + attributes: + listing_effective_date: + description: >- + Date when the species was added to this CITES appendix. + Important for determining legal status at time of specimen acquisition. + range: date + required: false + examples: + - value: "1975-07-01" + description: Original CITES listing (Convention entered into force) + - value: "2019-08-28" + description: Added at CoP18 (Geneva) + listing_authority: + description: >- + Authority responsible for the listing (typically CITES Secretariat or + a specific Conference of the Parties decision). + range: string + required: false + examples: + - value: "CITES Secretariat" + - value: "CoP18 Decision 18.219" + species_covered: + description: >- + Scientific name of the species covered by this listing. + May be at species, genus, or family level. + range: string + required: false + examples: + - value: "Raphus cucullatus" + description: Extinct dodo (historical listing) + - value: "Elephantidae" + description: All elephant species (family-level listing) + population_specific: + description: >- + Indicates if the listing applies to a specific population rather than + the entire species. Some CITES listings are population-specific. + range: boolean + required: false + examples: + - value: true + description: Population-specific listing (e.g., African elephant populations) + - value: false + description: Applies to all populations of the species + exemption_note: + description: >- + Notes on any exemptions or special provisions that apply. + range: string + required: false + examples: + - value: "Pre-Convention specimens exempt with documentation" + - value: "Captive-bred specimens listed as Appendix II" + exact_mappings: + - hc:CITESAppendix + close_mappings: + - schema:PropertyValue + see_also: + - https://cites.org/eng/app/appendices.php + - https://speciesplus.net/ + examples: + - value: + has_or_had_type: APPENDIX_I + has_or_had_label: "CITES Appendix I - Most Endangered" + listing_effective_date: "1975-07-01" + listing_authority: "CITES Secretariat" + species_covered: "Loxodonta africana" + population_specific: true + exemption_note: "Some populations listed in Appendix II" + description: African elephant CITES listing + - value: + has_or_had_type: NOT_LISTED + has_or_had_label: "Not regulated under CITES" + species_covered: "Raphus cucullatus" + exemption_note: "Extinct species - historical specimens pre-date CITES" + description: Dodo - extinct, not subject to CITES trade restrictions diff --git a/schemas/20251121/linkml/modules/classes/CauseOfDeath.yaml b/schemas/20251121/linkml/modules/classes/CauseOfDeath.yaml new file mode 100644 index 0000000000..452747a994 --- /dev/null +++ b/schemas/20251121/linkml/modules/classes/CauseOfDeath.yaml @@ -0,0 +1,110 @@ +# CauseOfDeath class +# Structured representation of the cause and circumstances of death +# +# Migration: Created per slot_fixes.yaml revision for circumstances_of_death (line 9369) +# +# Generation date: 2026-01-19 +# Rule compliance: 38 (slot centralization), 39 (RiC-O naming), 53 (slot_fixes.yaml) + +id: https://nde.nl/ontology/hc/class/CauseOfDeath +name: cause_of_death_class +title: Cause Of Death Class + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + wd: http://www.wikidata.org/entity/ + +default_prefix: hc + +imports: + - linkml:types + - ../metadata + - ../slots/has_or_had_type + - ../slots/has_or_had_description + - ../slots/has_or_had_location + - ./Location + - ../enums/CauseOfDeathTypeEnum + +classes: + CauseOfDeath: + class_uri: hc:CauseOfDeath + description: | + Structured representation of the cause and circumstances of a person's death. + + **Purpose**: + Captures structured information about how and why a person died: + - **Type**: Category of death (natural, conflict, accident, etc.) + - **Location**: Where the death occurred + - **Description**: Narrative details and context + + **Ontological Alignment**: + - **Primary** (`class_uri`): `hc:CauseOfDeath` - Heritage Custodian class + - **Related**: Wikidata P1196 (manner of death) - semantic equivalent + - **Related**: `schema:causeOfDeath` - Schema.org (MedicalCause context) + + **Heritage Sector Context**: + Particularly important for documenting deaths of heritage workers due to: + - **CONFLICT**: Armed conflict, airstrikes, military operations + - **TARGETED_ATTACK**: Violence specifically targeting cultural workers + - **OCCUPATIONAL**: Hazards from heritage work (conservation chemicals, etc.) + - **NATURAL**: Age, illness, medical conditions + - **ACCIDENT**: Non-occupational accidents + - **PERSECUTION**: Targeting due to identity or beliefs + + **Example - Conflict Death**: + ```yaml + is_or_was_caused_by: + cause_type: CONFLICT + has_or_had_description: | + Killed in Israeli airstrike on residential building in Gaza City. + The attack occurred during the 2023-2024 Israeli military operations. + has_or_had_location: + city: Gaza City + country: PS + ``` + + **Sensitivity Guidelines**: + - Handle with respect and dignity + - Verify facts from authoritative sources before documenting + - Consult with family or institution when possible + - Follow journalistic standards for reporting deaths + - Link to source documentation (news reports, institutional records) + + exact_mappings: + - wd:P1196 # Wikidata: manner of death + + slots: + - has_or_had_type + - has_or_had_description + - has_or_had_location + + slot_usage: + has_or_had_type: + range: CauseOfDeathTypeEnum + description: | + The category/type of death cause. Uses CauseOfDeathTypeEnum values: + NATURAL, CONFLICT, TARGETED_ATTACK, OCCUPATIONAL, ACCIDENT, PERSECUTION, UNKNOWN. + has_or_had_description: + range: string + description: | + Detailed narrative description of the death circumstances. + Include source documentation and context. + Handle with respect and verify facts before documenting. + has_or_had_location: + range: Location + inlined: true + description: | + The location where the death occurred. + Important for conflict deaths to document the specific location. + + comments: + - "Structured cause of death for heritage workers" + - "Wikidata P1196 (manner of death) is semantically equivalent" + - "Important for documenting conflict-related deaths" + - "Handle with respect and verify facts before documenting" + - "Include source documentation for verification" + + see_also: + - https://www.wikidata.org/wiki/Property:P1196 diff --git a/schemas/20251121/linkml/modules/classes/CertaintyLevel.yaml b/schemas/20251121/linkml/modules/classes/CertaintyLevel.yaml new file mode 100644 index 0000000000..6f06308f03 --- /dev/null +++ b/schemas/20251121/linkml/modules/classes/CertaintyLevel.yaml @@ -0,0 +1,150 @@ +# CertaintyLevel class +# Structured class for expressing certainty/confidence levels with notes +# +# Generation date: 2026-01-18 +# Rule compliance: 0 (LinkML single source of truth), 38 (slot centralization), 53 (slot_fixes.yaml) +# Migration: Replaces certainty_level + certainty_note bespoke slots +# +# Created per slot_fixes.yaml revisions: +# - certainty_level → has_or_had_level + CertaintyLevel +# - certainty_note → has_or_had_note + Note (within CertaintyLevel) + +id: https://nde.nl/ontology/hc/class/CertaintyLevel +name: certainty_level_class +title: Certainty Level Class + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + 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# + prov: http://www.w3.org/ns/prov# + +default_prefix: hc + +imports: + - linkml:types + - ../metadata + - ../slots/level_value + - ../slots/has_or_had_note + - ./Note + - ../slots/specificity_annotation + - ../slots/has_or_had_score + - ./SpecificityAnnotation + - ./TemplateSpecificityScore + - ./TemplateSpecificityType + - ./TemplateSpecificityTypes + +classes: + CertaintyLevel: + class_uri: rico:ConfidenceLevel + description: | + A structured representation of certainty/confidence level with explanatory notes. + + **Purpose**: + CertaintyLevel encapsulates both the level of certainty (CERTAIN, PROBABLE, + POSSIBLE, UNCERTAIN) and any notes explaining the certainty assessment. + Used primarily in provenance research to document confidence in ownership + transfer claims. + + **Ontological Alignment**: + - **Primary**: `rico:ConfidenceLevel` - RiC-O confidence level + - **Close**: `crm:P141_assigned` - CIDOC-CRM attribute assignment + + **Standard Values for level_value**: + - CERTAIN: Documentary evidence confirms the claim + - PROBABLE: Strong circumstantial evidence supports the claim + - POSSIBLE: Reasonable inference from available context + - UNCERTAIN: Speculative or unverified claim + + **Use Cases**: + - Provenance event certainty (ProvenanceEvent) + - Attribution confidence (artwork authorship) + - Dating confidence (temporal assertions) + - Identification confidence (person/place identification) + + **Replaces** (per slot_fixes.yaml): + - `certainty_level` (string) → has_or_had_level with CertaintyLevel class + - `certainty_note` (string) → has_or_had_note with Note class (within CertaintyLevel) + + exact_mappings: + - rico:ConfidenceLevel + + close_mappings: + - crm:P141_assigned + - prov:qualifiedAssociation + + slots: + - level_value + - has_or_had_note + - specificity_annotation + - has_or_had_score + + slot_usage: + level_value: + description: | + The certainty/confidence level value. + Standard values: CERTAIN, PROBABLE, POSSIBLE, UNCERTAIN. + range: string + required: true + examples: + - value: CERTAIN + description: Documentary evidence confirms claim + - value: PROBABLE + description: Strong circumstantial evidence + - value: POSSIBLE + description: Reasonable inference + - value: UNCERTAIN + description: Speculative/unverified + has_or_had_note: + description: | + Notes explaining the certainty assessment. + Use Note class with note_type: "certainty" for certainty-specific notes. + range: Note + multivalued: true + inlined: true + required: false + examples: + - value: + note_type: certainty + note_content: "Confirmed by sale catalogue and receipt" + description: Documentary evidence note + - value: + note_type: certainty + note_content: "Inferred from stylistic analysis and collection history" + description: Circumstantial evidence note + - value: + note_type: certainty + note_content: "Provenance gap 1933-1945 requires further research" + description: Research gap note + + annotations: + custodian_types: '["*"]' + custodian_types_rationale: Certainty documentation applicable to all custodian types. + custodian_types_primary: null + specificity_score: 0.4 + specificity_rationale: Moderately specific class for provenance and attribution certainty. + + examples: + - value: | + level_value: CERTAIN + has_or_had_note: + - note_type: certainty + note_content: "Confirmed by sale catalogue and receipt" + note_date: "2025-06-15" + description: "Certain provenance event with documentary evidence" + - value: | + level_value: PROBABLE + has_or_had_note: + - note_type: certainty + note_content: "Van Ruijven was Vermeer's patron; likely acquired directly from artist" + description: "Probable ownership based on historical relationship" + - value: | + level_value: UNCERTAIN + has_or_had_note: + - note_type: certainty + note_content: "Provenance gap 1933-1945 requires further research" + - note_type: certainty + note_content: "Documentation incomplete; collector fled Vienna 1938" + description: "Uncertain Nazi-era provenance requiring research" diff --git a/schemas/20251121/linkml/modules/classes/ChAnnotatorEntityClaim.yaml b/schemas/20251121/linkml/modules/classes/ChAnnotatorEntityClaim.yaml index fe0bb11980..0e3c25099c 100644 --- a/schemas/20251121/linkml/modules/classes/ChAnnotatorEntityClaim.yaml +++ b/schemas/20251121/linkml/modules/classes/ChAnnotatorEntityClaim.yaml @@ -1,6 +1,7 @@ # ChAnnotatorEntityClaim - Individual claim about an entity # Extracted from custodian_source.yaml per Rule 38 (modular schema files) # Extraction date: 2026-01-08 +# MIGRATION 2026-01-19: claim_type → has_or_had_type + ClaimType (Rule 53/56) id: https://nde.nl/ontology/hc/classes/ChAnnotatorEntityClaim name: ChAnnotatorEntityClaim @@ -17,10 +18,12 @@ prefixes: imports: - linkml:types - - - ./ChAnnotatorProvenance - ./ExtractionSourceInfo + # ADDED 2026-01-19: claim_type migration (Rule 53/56) + - ../slots/has_or_had_type + - ./ClaimType + - ./ClaimTypes default_range: string classes: @@ -43,11 +46,19 @@ classes: related_mappings: - prov:Entity - schema:PropertyValue - attributes: - claim_type: - range: string + slots: + - has_or_had_type + slot_usage: + has_or_had_type: + range: ClaimType + inlined: true required: true - description: Type of claim (full_name, institution_type, etc.) + description: | + MIGRATED from claim_type per slot_fixes.yaml (Rule 53/56, 2026-01-19). + Type of claim (full_name, institution_type, etc.). + Uses ClaimType class hierarchy with 507 concrete subtypes. + attributes: + # REMOVED 2026-01-19: claim_type - migrated to has_or_had_type slot (Rule 53/56) claim_value: range: string required: true diff --git a/schemas/20251121/linkml/modules/classes/City.yaml b/schemas/20251121/linkml/modules/classes/City.yaml new file mode 100644 index 0000000000..38d7f70634 --- /dev/null +++ b/schemas/20251121/linkml/modules/classes/City.yaml @@ -0,0 +1,122 @@ +# City - A city/town settlement entity +# Created: 2026-01-18 +# Migration from city (string) slot per slot_fixes.yaml revision +# City is_a Settlement per established pattern + +id: https://nde.nl/ontology/hc/class/City +name: city_class +title: City Class + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + gn: http://www.geonames.org/ontology# + wikidata: http://www.wikidata.org/entity/ + crm: http://www.cidoc-crm.org/cidoc-crm/ + +imports: + - linkml:types + - ./Settlement + +default_prefix: hc + +classes: + City: + is_a: Settlement + class_uri: schema:City + description: | + A city or large town settlement. + + **RELATIONSHIP TO SETTLEMENT**: + + City is a subclass of Settlement representing urban areas that are + typically larger and more administratively significant than villages + or small towns. + + **GeoNames Feature Codes**: + + Cities typically correspond to GeoNames feature codes: + - PPL: Populated place (general) + - PPLA: Seat of first-order administrative division + - PPLA2: Seat of second-order administrative division + - PPLC: Capital of a political entity + - PPLS: Populated places (urban agglomerations) + + **USAGE**: + + Use City class when: + - The settlement is known to be a city (not village/hamlet) + - You need to express city-specific semantics + - Schema.org City alignment is important + + Use Settlement class when: + - The settlement type is unknown or mixed + - You want the most general geographic entity + + **EXAMPLES**: + + ```yaml + is_or_was_located_in: + - settlement_name: "Amsterdam" + geonames_id: 2759794 + country: "NL" + ``` + + exact_mappings: + - schema:City + close_mappings: + - gn:P.PPLA + - gn:P.PPLC + - wikidata:Q515 + related_mappings: + - crm:E53_Place + + # Inherits all slots from Settlement: + # - settlement_name + # - geonames_id + # - latitude + # - longitude + # - country + # - has_or_had_geographic_subdivision (subregion) + # - specificity_annotation + # - has_or_had_score + + annotations: + specificity_score: 0.35 + specificity_rationale: | + Slightly more specific than Settlement (0.30) as it indicates + urban status, but still broadly applicable across heritage contexts. + custodian_types: '["*"]' + custodian_types_rationale: | + All heritage custodians are located in cities or settlements. + custodian_types_primary: "*" + + examples: + - value: + settlement_name: "Amsterdam" + geonames_id: 2759794 + country: "NL" + has_or_had_geographic_subdivision: + subregion_code: "NL-NH" + description: Amsterdam - capital and largest city of the Netherlands + + - value: + settlement_name: "Haarlem" + geonames_id: 2755420 + country: "NL" + latitude: 52.3873 + longitude: 4.6462 + description: Haarlem - city in Noord-Holland province + + - value: + settlement_name: "Tokyo" + geonames_id: 1850147 + country: "JP" + description: Tokyo - capital of Japan + + comments: + - City is_a Settlement following semantic hierarchy + - Inherits all Settlement slots including GeoNames ID + - Use for explicit urban classification + - Created per slot_fixes.yaml migration for city slot (2026-01-18) diff --git a/schemas/20251121/linkml/modules/classes/Claim.yaml b/schemas/20251121/linkml/modules/classes/Claim.yaml new file mode 100644 index 0000000000..5c7144907e --- /dev/null +++ b/schemas/20251121/linkml/modules/classes/Claim.yaml @@ -0,0 +1,51 @@ +id: https://nde.nl/ontology/hc/class/Claim +name: Claim +title: Claim Class - Base Class for Assertions +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + prov: http://www.w3.org/ns/prov# + arg: http://www.w3.org/ns/argument# +imports: + - linkml:types +default_prefix: hc +classes: + Claim: + class_uri: prov:Entity + description: | + Base class for assertions or claims made about heritage entities. + + A claim represents a statement that warrants (supports or justifies) + other statements or conclusions. Claims can come from various sources: + - Web pages (WebClaim subclass) + - Wikidata (WikidataClaim) + - Research sources + - Human annotations + + **Argumentation Semantics**: + The term "warrants" comes from argumentation theory (Toulmin model): + - Claims provide evidence that WARRANTS (justifies) conclusions + - A claim can be warranted BY other supporting claims + + This bidirectional relationship is captured by the `warrants_or_warranted` slot. + + **Subclasses**: + - WebClaim: Claims extracted from web pages with XPath provenance + - WikidataClaim: Claims from Wikidata with property/value structure + - PersonWebClaim: Claims about persons from web sources + - CustodianLegalNameClaim: Claims about custodian legal names + + **MIGRATION NOTE (2026-01-19)**: + Created as base class for claim type hierarchy per slot_fixes.yaml (Rule 53/56). + Replaces generic `claim` slot with `warrants_or_warranted` slot. + exact_mappings: + - prov:Entity + close_mappings: + - schema:Claim + - schema:PropertyValue + slots: [] # Base class - slots defined in subclasses + comments: + - Base class for claim type hierarchy + - Subclasses add specific provenance mechanisms + - 'CREATED 2026-01-19: Per slot_fixes.yaml revision (Rule 53/56)' diff --git a/schemas/20251121/linkml/modules/classes/ClaimType.yaml b/schemas/20251121/linkml/modules/classes/ClaimType.yaml new file mode 100644 index 0000000000..f70614783f --- /dev/null +++ b/schemas/20251121/linkml/modules/classes/ClaimType.yaml @@ -0,0 +1,80 @@ +id: https://nde.nl/ontology/hc/class/ClaimType +name: ClaimType +title: ClaimType Class - Base class for web claim types +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + dcterms: http://purl.org/dc/terms/ + skos: http://www.w3.org/2004/02/skos/core# +imports: + - linkml:types + - ../slots/has_or_had_label + - ../slots/has_or_had_description +default_prefix: hc + +classes: + ClaimType: + class_uri: skos:Concept + description: | + Abstract base class for types of claims that can be extracted from web pages. + + Each claim type has expected source locations in HTML: + - full_name: