diff --git a/frontend/public/schemas/20251121/linkml/manifest.json b/frontend/public/schemas/20251121/linkml/manifest.json index 5c7c131557..a3e8f6a557 100644 --- a/frontend/public/schemas/20251121/linkml/manifest.json +++ b/frontend/public/schemas/20251121/linkml/manifest.json @@ -1,12 +1,12 @@ { - "generated": "2026-01-25T11:47:39.065Z", + "generated": "2026-01-25T23:23:44.391Z", "schemaRoot": "/schemas/20251121/linkml", - "totalFiles": 3045, + "totalFiles": 3044, "categoryCounts": { "main": 4, - "class": 1026, + "class": 1033, "enum": 154, - "slot": 1857, + "slot": 1849, "module": 4 }, "categories": [ @@ -1490,6 +1490,11 @@ "path": "modules/classes/DeviceTypes.yaml", "category": "class" }, + { + "name": "DiarizationStatus", + "path": "modules/classes/DiarizationStatus.yaml", + "category": "class" + }, { "name": "DigitalArchive", "path": "modules/classes/DigitalArchive.yaml", @@ -1505,11 +1510,21 @@ "path": "modules/classes/DigitalArchiveRecordSetTypes.yaml", "category": "class" }, + { + "name": "DigitalConfidence", + "path": "modules/classes/DigitalConfidence.yaml", + "category": "class" + }, { "name": "DigitalPlatform", "path": "modules/classes/DigitalPlatform.yaml", "category": "class" }, + { + "name": "DigitalPlatformScore", + "path": "modules/classes/DigitalPlatformScore.yaml", + "category": "class" + }, { "name": "DigitalPlatformType", "path": "modules/classes/DigitalPlatformType.yaml", @@ -1575,6 +1590,21 @@ "path": "modules/classes/DigitalPlatformV2TransformationMetadata.yaml", "category": "class" }, + { + "name": "DigitalPresence", + "path": "modules/classes/DigitalPresence.yaml", + "category": "class" + }, + { + "name": "DigitalPresenceType", + "path": "modules/classes/DigitalPresenceType.yaml", + "category": "class" + }, + { + "name": "DigitalProficiency", + "path": "modules/classes/DigitalProficiency.yaml", + "category": "class" + }, { "name": "DimArchives", "path": "modules/classes/DimArchives.yaml", @@ -4045,6 +4075,11 @@ "path": "modules/classes/SourceWork.yaml", "category": "class" }, + { + "name": "Speaker", + "path": "modules/classes/Speaker.yaml", + "category": "class" + }, { "name": "SpecialCollection", "path": "modules/classes/SpecialCollection.yaml", @@ -6697,71 +6732,11 @@ "path": "modules/slots/description_type.yaml", "category": "slot" }, - { - "name": "device_count", - "path": "modules/slots/device_count.yaml", - "category": "slot" - }, - { - "name": "diarization_confidence", - "path": "modules/slots/diarization_confidence.yaml", - "category": "slot" - }, - { - "name": "diarization_enabled", - "path": "modules/slots/diarization_enabled.yaml", - "category": "slot" - }, - { - "name": "diarization_end_seconds", - "path": "modules/slots/diarization_end_seconds.yaml", - "category": "slot" - }, - { - "name": "diarization_speaker_id", - "path": "modules/slots/diarization_speaker_id.yaml", - "category": "slot" - }, - { - "name": "diarization_speaker_label", - "path": "modules/slots/diarization_speaker_label.yaml", - "category": "slot" - }, - { - "name": "diarization_start_seconds", - "path": "modules/slots/diarization_start_seconds.yaml", - "category": "slot" - }, - { - "name": "digital_confidence", - "path": "modules/slots/digital_confidence.yaml", - "category": "slot" - }, - { - "name": "digital_indicator", - "path": "modules/slots/digital_indicator.yaml", - "category": "slot" - }, - { - "name": "digital_platform", - "path": "modules/slots/digital_platform.yaml", - "category": "slot" - }, - { - "name": "digital_platform_score", - "path": "modules/slots/digital_platform_score.yaml", - "category": "slot" - }, { "name": "digital_presence_type", "path": "modules/slots/digital_presence_type.yaml", "category": "slot" }, - { - "name": "digital_professional", - "path": "modules/slots/digital_professional.yaml", - "category": "slot" - }, { "name": "digital_surrogate", "path": "modules/slots/digital_surrogate.yaml", @@ -6812,11 +6787,6 @@ "path": "modules/slots/dissolution_date.yaml", "category": "slot" }, - { - "name": "dissolve_count", - "path": "modules/slots/dissolve_count.yaml", - "category": "slot" - }, { "name": "dissolved_date", "path": "modules/slots/dissolved_date.yaml", @@ -7022,6 +6992,11 @@ "path": "modules/slots/emic_name.yaml", "category": "slot" }, + { + "name": "emphasizes_or_emphasized", + "path": "modules/slots/emphasizes_or_emphasized.yaml", + "category": "slot" + }, { "name": "employer_linkedin_url", "path": "modules/slots/employer_linkedin_url.yaml", @@ -7187,6 +7162,11 @@ "path": "modules/slots/estimated_volume.yaml", "category": "slot" }, + { + "name": "estimates_or_estimated", + "path": "modules/slots/estimates_or_estimated.yaml", + "category": "slot" + }, { "name": "etag", "path": "modules/slots/etag.yaml", @@ -9192,6 +9172,11 @@ "path": "modules/slots/has_or_had_digital_platform.yaml", "category": "slot" }, + { + "name": "has_or_had_digital_presence", + "path": "modules/slots/has_or_had_digital_presence.yaml", + "category": "slot" + }, { "name": "has_or_had_direction", "path": "modules/slots/has_or_had_direction.yaml", @@ -10562,6 +10547,11 @@ "path": "modules/slots/includes_timestamp.yaml", "category": "slot" }, + { + "name": "indicates_or_indicated", + "path": "modules/slots/indicates_or_indicated.yaml", + "category": "slot" + }, { "name": "industry_benchmark_high", "path": "modules/slots/industry_benchmark_high.yaml", @@ -10967,6 +10957,11 @@ "path": "modules/slots/is_or_was_derived_from.yaml", "category": "slot" }, + { + "name": "is_or_was_diarized", + "path": "modules/slots/is_or_was_diarized.yaml", + "category": "slot" + }, { "name": "is_or_was_encompassed_by", "path": "modules/slots/is_or_was_encompassed_by.yaml", diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Custodian.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Custodian.yaml index c92d501da8..9b4b072cfb 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/Custodian.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/Custodian.yaml @@ -23,7 +23,9 @@ imports: - ../slots/has_or_had_custodian_type - ../slots/legal_status - ../slots/place_designation - - ../slots/digital_platform + # MIGRATED 2026-01-25: digital_platform → has_or_had_digital_presence (Rule 53) + - ../slots/has_or_had_digital_presence + # - ../slots/digital_platform # REMOVED - ../slots/has_or_had_collection # was: has_collection - migrated per Rule 53 (2025-01-15) - ../slots/organizational_structure - ../slots/has_or_had_organizational_change_event @@ -196,7 +198,8 @@ classes: - created - has_or_had_custodian_type - has_or_had_policy # was: data_license_policy - migrated per Rule 53 (2026-01-22) - - digital_platform + # MIGRATED 2026-01-25: digital_platform → has_or_had_digital_presence (Rule 53) + - has_or_had_digital_presence - is_or_was_encompassed_by # was: encompassing_body - migrated per Rule 53 (2025-01-15) - has_or_had_exhibition - gift_shop @@ -235,11 +238,15 @@ classes: range: CustodianPlace inlined: true required: false - digital_platform: + # MIGRATED 2026-01-25: digital_platform → has_or_had_digital_presence (Rule 53) + has_or_had_digital_presence: range: DigitalPlatform multivalued: true required: false inlined_as_list: true + description: | + Digital platform(s) or online presence(s) associated with this custodian. + MIGRATED from digital_platform per slot_fixes.yaml (Rule 53, 2026-01-25). has_or_had_collection: # was: has_collection - migrated per Rule 53 (2025-01-15) range: CustodianCollection multivalued: true diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/DiarizationStatus.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/DiarizationStatus.yaml new file mode 100644 index 0000000000..0cd22d9176 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/DiarizationStatus.yaml @@ -0,0 +1,69 @@ +# DiarizationStatus class +# Status of speaker diarization process +# +# Generation date: 2026-01-25 +# Rule compliance: 0 (LinkML single source of truth), 53 (migration from diarization_enabled) +# Migration source: diarization_enabled slot per slot_fixes.yaml + +id: https://nde.nl/ontology/hc/class/DiarizationStatus +name: diarization_status_class +title: DiarizationStatus Class + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + +default_prefix: hc + +imports: + - linkml:types + - ../slots/has_or_had_label + - ../slots/has_or_had_identifier + +classes: + DiarizationStatus: + class_uri: schema:ActionStatusType + description: | + Represents the status of a speaker diarization process (enabled, disabled, completed, failed). + + **MIGRATION SOURCE**: Created from diarization_enabled slot migration (Rule 53, 2026-01-25). + + **Ontological Alignment**: + - **Primary**: `schema:ActionStatusType` - Status of an action + + exact_mappings: + - schema:ActionStatusType + + slots: + - has_or_had_identifier + - has_or_had_label + + slot_usage: + has_or_had_identifier: + description: Status code or identifier (e.g., "COMPLETED", "ENABLED"). + range: uriorcurie + required: false + has_or_had_label: + description: Human-readable status description. + range: string + required: true + + annotations: + custodian_types: '["*"]' + specificity_score: 0.8 + specificity_rationale: Specific to media analysis processes. + + comments: + - "CREATED from diarization_enabled migration per slot_fixes.yaml (Rule 53)" + - "Tracks status of diarization process" + + examples: + - value: + has_or_had_label: Enabled + has_or_had_identifier: https://schema.org/ActiveActionStatus + description: Diarization enabled/active + - value: + has_or_had_label: Completed + has_or_had_identifier: https://schema.org/CompletedActionStatus + description: Diarization completed diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/DigitalConfidence.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/DigitalConfidence.yaml new file mode 100644 index 0000000000..3e57d906e1 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/DigitalConfidence.yaml @@ -0,0 +1,82 @@ +# DigitalConfidence class +# Represents confidence assessment for digital attributes/skills +# +# Created: 2026-01-25 +# Rule compliance: 0b (Type/Types pattern), 38 (slot centralization), 39 (RiC-O naming), 53 (slot_fixes.yaml) +# Migration: digital_confidence → estimates_or_estimated + DigitalConfidence + +id: https://nde.nl/ontology/hc/class/DigitalConfidence +name: DigitalConfidence +title: Digital Confidence Class + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + dqv: http://www.w3.org/ns/dqv# + schema: http://schema.org/ + +default_prefix: hc + +imports: + - linkml:types + - ../metadata + - ../slots/has_or_had_score + - ../slots/has_or_had_description + - ../slots/has_or_had_type + +classes: + DigitalConfidence: + class_uri: dqv:QualityMeasurement + description: | + Confidence assessment for digital attributes, skills, or proficiency. + + **DEFINITION**: + + DigitalConfidence captures the certainty level associated with an inferred + or extracted digital attribute (e.g., digital proficiency inferred from a profile). + + **Ontological Alignment**: + - **DQV**: `dqv:QualityMeasurement` - quality/confidence metric + + **Migrated From** (per slot_fixes.yaml): + - `digital_confidence` (float) → estimates_or_estimated + DigitalConfidence + + exact_mappings: + - dqv:QualityMeasurement + + slots: + - has_or_had_score + - has_or_had_description + - has_or_had_type + + slot_usage: + has_or_had_score: + description: | + Numeric confidence score (0.0-1.0). + Inherits broad range (Any) but overrides description/examples. + range: float + required: true + minimum_value: 0.0 + maximum_value: 1.0 + examples: + - value: 0.85 + description: High confidence estimation + has_or_had_type: + description: Type of confidence assessment (e.g., PROFICIENCY_INFERENCE) + examples: + - value: SKILL_INFERENCE + has_or_had_description: + description: Explanation of the confidence assessment + examples: + - value: "Inferred from explicit skill endorsements and project history" + + annotations: + custodian_types: '["P"]' + custodian_types_rationale: Digital confidence applies to person profiles (custodian staff) + specificity_score: 0.60 + specificity_rationale: Specific to person profile enrichment + + comments: + - "Represents confidence in digital attribute assessments" + - "Migrated from digital_confidence slot per slot_fixes.yaml" + - "Used in LinkedInProfile enrichment" diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/DigitalPlatformScore.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/DigitalPlatformScore.yaml new file mode 100644 index 0000000000..c80968a5ca --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/DigitalPlatformScore.yaml @@ -0,0 +1,52 @@ +# DigitalPlatformScore class +# Score for digital platform relevance/specificity +# +# Generation date: 2026-01-25 +# Rule compliance: 0, 53 +# Migration source: digital_platform_score slot per slot_fixes.yaml + +id: https://nde.nl/ontology/hc/class/DigitalPlatformScore +name: digital_platform_score_class +title: Digital Platform Score Class + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + sosa: http://www.w3.org/ns/sosa/ + +default_prefix: hc + +imports: + - linkml:types + - ../slots/has_or_had_score + +classes: + DigitalPlatformScore: + class_uri: sosa:Result + description: | + Represents a score for digital platform relevance or specificity. + + **MIGRATION SOURCE**: Created from digital_platform_score slot migration (Rule 53, 2026-01-25). + + **Ontological Alignment**: + - **Primary**: `sosa:Result` - Result of an observation/scoring + + exact_mappings: + - sosa:Result + + slots: + - has_or_had_score + + slot_usage: + has_or_had_score: + description: The score value (0.0-1.0). + range: float + required: true + minimum_value: 0.0 + maximum_value: 1.0 + + annotations: + custodian_types: '["*"]' + specificity_score: 0.2 + specificity_rationale: "Used for scoring digital platform relevance." diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/DigitalPresence.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/DigitalPresence.yaml new file mode 100644 index 0000000000..62df6cf1af --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/DigitalPresence.yaml @@ -0,0 +1,65 @@ +# DigitalPresence class +# Represents a digital presence instance (wrapper) +# +# Generation date: 2026-01-25 +# Rule compliance: 0, 53 +# Migration source: digital_presence_type slot per slot_fixes.yaml + +id: https://nde.nl/ontology/hc/class/DigitalPresence +name: digital_presence_class +title: Digital Presence Class + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + crm: http://www.cidoc-crm.org/cidoc-crm/ + schema: http://schema.org/ + +default_prefix: hc + +imports: + - linkml:types + - ../slots/has_or_had_type + - ../slots/has_or_had_identifier + - ./DigitalPresenceType + - ./DigitalPresenceTypes + +classes: + DigitalPresence: + class_uri: crm:E1_CRM_Entity + description: | + Represents a digital presence being asserted about (e.g. as primary). + Wrapper that links a specific presence instance (URI) to its type classification. + + **MIGRATION SOURCE**: Created from digital_presence_type slot migration (Rule 53, 2026-01-25). + + **Pattern**: Replaces `digital_presence_type` slot on assertion with structured object: + - `has_or_had_identifier`: URI of the presence (SocialMediaProfile, Website, etc.) + - `has_or_had_type`: Classification (DigitalPresenceType) + + exact_mappings: + - crm:E1_CRM_Entity + + slots: + - has_or_had_identifier + - has_or_had_type + + slot_usage: + has_or_had_identifier: + description: URI of the digital presence instance (e.g. hc:social-media/fb). + range: uriorcurie + required: true + has_or_had_type: + description: Type classification of this presence. + range: DigitalPresenceType + required: true + inlined: true + + annotations: + custodian_types: '["*"]' + specificity_score: 0.5 + specificity_rationale: "Used for asserting properties of digital presences." + + comments: + - "CREATED from digital_presence_type migration per slot_fixes.yaml (Rule 53)" + - "Wrapper for linking presence instance to its type" diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/DigitalPresenceType.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/DigitalPresenceType.yaml new file mode 100644 index 0000000000..88e28f0d71 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/DigitalPresenceType.yaml @@ -0,0 +1,58 @@ +# DigitalPresenceType class (Abstract Base) +# Taxonomy for digital presence types +# +# Generation date: 2026-01-25 +# Rule compliance: 0, 0b, 53 +# Migration source: DigitalPresenceTypeEnum per slot_fixes.yaml + +id: https://nde.nl/ontology/hc/class/DigitalPresenceType +name: digital_presence_type_class +title: DigitalPresenceType Class (Abstract) + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + +default_prefix: hc + +imports: + - linkml:types + - ../slots/has_or_had_label + - ../slots/has_or_had_identifier + +classes: + DigitalPresenceType: + class_uri: schema:Intangible + abstract: true + description: | + Abstract base class for digital presence taxonomy. + + **MIGRATION SOURCE**: Replaces DigitalPresenceTypeEnum (Rule 53, 2026-01-25). + + **Pattern**: Type/Types (Rule 0b) + - DigitalPresenceType (this file): Abstract base + - DigitalPresenceTypes (separate file): Concrete subclasses + + exact_mappings: + - schema:Intangible + + slots: + - has_or_had_identifier + - has_or_had_label + + slot_usage: + has_or_had_identifier: + description: Unique identifier for this presence type. + range: uriorcurie + required: false + has_or_had_label: + description: Human-readable name of this presence type. + range: string + required: true + + annotations: + custodian_types: '["*"]' + specificity_score: 0.6 + type_types_pattern: base + type_types_related: DigitalPresenceTypes diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/DigitalProficiency.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/DigitalProficiency.yaml new file mode 100644 index 0000000000..a7c8a2442d --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/DigitalProficiency.yaml @@ -0,0 +1,89 @@ +# DigitalProficiency class +# Represents a digital skill, tool, or competency +# +# Created: 2026-01-25 +# Rule compliance: 0b (Type/Types pattern), 38 (slot centralization), 39 (RiC-O naming), 53 (slot_fixes.yaml) +# Migration: digital_indicator → emphasizes_or_emphasized + DigitalProficiency + +id: https://nde.nl/ontology/hc/class/DigitalProficiency +name: DigitalProficiency +title: Digital Proficiency 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# + +default_prefix: hc + +imports: + - linkml:types + - ../metadata + - ../slots/has_or_had_label + - ../slots/has_or_had_description + - ../slots/has_or_had_type + +classes: + DigitalProficiency: + class_uri: schema:DefinedTerm + description: | + A digital skill, tool, competency, or proficiency indicator. + + **DEFINITION**: + + DigitalProficiency represents a specific digital capability (e.g., "Python", + "Data Analysis", "CMS Management") identified in a person's profile. + + **Ontological Alignment**: + - **Schema.org**: `schema:DefinedTerm` - defined concept (skill) + - **SKOS**: `skos:Concept` - concept in a scheme + + **Migrated From** (per slot_fixes.yaml): + - `digital_indicator` (string list) → emphasizes_or_emphasized + DigitalProficiency + - `digital_professional` (boolean) → indicates_or_indicated + DigitalProficiency + + exact_mappings: + - schema:DefinedTerm + + close_mappings: + - skos:Concept + + slots: + - has_or_had_label + - has_or_had_description + - has_or_had_type + + slot_usage: + has_or_had_label: + description: Name of the proficiency (e.g., "Python", "Data Science") + required: true + examples: + - value: "Python" + - value: "Linked Data" + has_or_had_type: + description: Category of proficiency (LANGUAGE, TOOL, CONCEPT, etc.) + examples: + - value: PROGRAMMING_LANGUAGE + - value: METHODOLOGY + + annotations: + custodian_types: '["P"]' + custodian_types_rationale: Digital proficiency applies to person profiles + specificity_score: 0.60 + specificity_rationale: Specific to person profile enrichment and skills analysis + + comments: + - "Represents specific digital skills/indicators" + - "Migrated from digital_indicator string list" + - "Used in DigitalProfessionalAssessment" + + examples: + - value: + has_or_had_label: "Python" + has_or_had_type: "PROGRAMMING_LANGUAGE" + description: Python programming skill + - value: + has_or_had_label: "Collection Management Systems" + has_or_had_type: "DOMAIN_TOOL" + description: CMS proficiency diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/InformationCarrier.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/InformationCarrier.yaml index c76ef3c003..7e638d650d 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/InformationCarrier.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/InformationCarrier.yaml @@ -53,6 +53,9 @@ imports: - ../slots/is_or_was_published - ./Publication - ../slots/doi + # MIGRATED 2026-01-25: duration → has_or_had_time_interval + TimeInterval (Rule 53) + - ../slots/has_or_had_time_interval + - ./TimeInterval - ../slots/duration - ../slots/edition_statement - ../slots/extent_text @@ -149,7 +152,8 @@ classes: # REMOVED 2026-01-24: date_of_publication - migrated to is_or_was_published (Rule 53) - is_or_was_published - doi - - duration + # MIGRATED 2026-01-25: duration → has_or_had_time_interval (Rule 53) + - has_or_had_time_interval - edition_statement - extent_text - file_number @@ -227,13 +231,22 @@ classes: examples: - value: 'xii, 324 p., [8] p. of plates : ill. ; 24 cm' - value: '1 atlas (42 maps) : col. ; 38 cm' - duration: + # MIGRATED 2026-01-25: duration → has_or_had_time_interval + TimeInterval (Rule 53) + has_or_had_time_interval: required: false - range: string + range: TimeInterval + inlined: true + description: | + Duration of the audiovisual carrier. + MIGRATED from duration (string) to TimeInterval class. examples: - - value: PT45M30S - description: 45 minutes 30 seconds - - value: 01:32:15 + - value: + duration_value: PT45M30S + duration_description: 45 minutes 30 seconds + description: Audio recording duration + - value: + duration_value: 01:32:15 + description: Duration in HH:MM:SS format has_or_had_type: required: false range: BindingType diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/InternetOfThings.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/InternetOfThings.yaml index 071e5e0573..781617253f 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/InternetOfThings.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/InternetOfThings.yaml @@ -20,7 +20,11 @@ imports: # REMOVED 2026-01-22: data_format migrated to has_or_had_output + OutputData (Rule 53) - ../slots/is_or_was_decommissioned_at # was: decommission_date - migrated per Rule 53 (2026-01-23) - ./Timestamp # Range for is_or_was_decommissioned_at - - ../slots/device_count + # MIGRATED 2026-01-25: device_count → has_or_had_quantity + Quantity (Rule 53) + - ../slots/has_or_had_quantity + - ../slots/has_or_had_unit + - ./Quantity + - ./Unit # MIGRATED 2026-01-25: device_id → has_or_had_identifier + Identifier (Rule 53) - ../slots/has_or_had_identifier - ./Identifier @@ -119,7 +123,8 @@ classes: - coverage_area - has_or_had_output # was: data_format - migrated per Rule 53 (2026-01-22) - is_or_was_decommissioned_at # was: decommission_date - migrated per Rule 53 (2026-01-23) - - device_count + # MIGRATED 2026-01-25: device_count → has_or_had_quantity (Rule 53) + - has_or_had_quantity # MIGRATED 2026-01-25: device_id → has_or_had_identifier (Rule 53) - has_or_had_identifier # MIGRATED 2026-01-25: device_manufacturer → is_or_was_created_by (Rule 53) @@ -225,15 +230,30 @@ classes: - value: has_or_had_label: Samsung description: Kiosk manufacturer - device_count: - range: integer - minimum_value: 1 + # MIGRATED 2026-01-25: device_count → has_or_had_quantity (Rule 53) + has_or_had_quantity: + description: | + MIGRATED from device_count per slot_fixes.yaml (Rule 53, 2026-01-25). + Count of devices in this network/group. + Uses Quantity class with unit "device". + range: Quantity + inlined: true + required: false examples: - - value: 24 + - value: + quantity_value: 24 + has_or_had_unit: + unit_value: "device" description: 24 beacons in gallery network - - value: 150 + - value: + quantity_value: 150 + has_or_had_unit: + unit_value: "device" description: 150 climate sensors across facility - - value: 1 + - value: + quantity_value: 1 + has_or_had_unit: + unit_value: "device" description: Single information kiosk coverage_area: range: string @@ -405,7 +425,10 @@ classes: has_or_had_label: Estimote Proximity Beacon is_or_was_created_by: has_or_had_label: Estimote - device_count: 24 + has_or_had_quantity: + quantity_value: 24 + has_or_had_unit: + unit_value: "device" coverage_area: Gallery of Honour (main wing) purpose: Proximity triggers for mobile app content near masterpieces connectivity_type: @@ -428,7 +451,10 @@ classes: has_or_had_label: Sensirion SHT45 is_or_was_created_by: has_or_had_label: Sensirion - device_count: 150 + has_or_had_quantity: + quantity_value: 150 + has_or_had_unit: + unit_value: "device" coverage_area: All galleries and storage areas purpose: Temperature and humidity monitoring for preservation connectivity_type: @@ -465,7 +491,10 @@ classes: has_or_had_label: Samsung Kiosk 24 Touch is_or_was_created_by: has_or_had_label: Samsung - device_count: 4 + has_or_had_quantity: + quantity_value: 4 + has_or_had_unit: + unit_value: "device" coverage_area: Main entrance lobby purpose: Self-service collection search and wayfinding for visitors has_or_had_specification: 24-inch touchscreen, 1920x1080 resolution, wheelchair accessible diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/LinkedInProfile.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/LinkedInProfile.yaml index 0893bfacfe..c32fae282c 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/LinkedInProfile.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/LinkedInProfile.yaml @@ -24,8 +24,13 @@ imports: - ../slots/connections_text - ../slots/has_or_had_source # was: data_source_whatsapp - migrated per Rule 53/56/57 (2026-01-23) - ./DataSource - - ../slots/digital_confidence - - ../slots/digital_indicator + # MIGRATED 2026-01-25: digital_confidence → estimates_or_estimated + DigitalConfidence (Rule 53) + - ../slots/estimates_or_estimated + - ./DigitalConfidence + # MIGRATED 2026-01-25: digital_indicator → emphasizes_or_emphasized + DigitalProficiency (Rule 53) + - ../slots/emphasizes_or_emphasized + - ./DigitalProficiency + # - ../slots/digital_indicator # REMOVED - ../slots/digital_professional - ../slots/education - ../slots/enriched_date @@ -267,15 +272,20 @@ classes: ' slots: - - digital_professional + # MIGRATED 2026-01-25: digital_professional → indicates_or_indicated (Rule 53) + - indicates_or_indicated - enrichment_metadata_whatsapp - specificity_annotation - has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17) - has_or_had_likelihood_score # was: whatsapp_business_likelihood - migrated per Rule 53 slot_usage: - digital_professional: + # MIGRATED 2026-01-25: digital_professional → indicates_or_indicated (Rule 53) + indicates_or_indicated: range: DigitalProfessionalAssessment inlined: true + description: | + Indicates digital professional assessment. + Migrated from digital_professional. has_or_had_likelihood_score: # was: whatsapp_business_likelihood - migrated per Rule 53 range: LikelihoodScore inlined: true @@ -291,19 +301,43 @@ classes: ' slots: - - digital_confidence - - digital_indicator + # MIGRATED 2026-01-25: digital_confidence → estimates_or_estimated (Rule 53) + - estimates_or_estimated + # MIGRATED 2026-01-25: digital_indicator → emphasizes_or_emphasized (Rule 53) + - emphasizes_or_emphasized - likely_whatsapp_proficient - specificity_annotation - has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17) slot_usage: likely_whatsapp_proficient: range: boolean - digital_indicator: - range: string + # MIGRATED 2026-01-25: digital_indicator → emphasizes_or_emphasized + DigitalProficiency (Rule 53) + emphasizes_or_emphasized: + range: DigitalProficiency + inlined: true multivalued: true - digital_confidence: - range: string + description: | + Digital proficiency indicators (skills/tools) emphasized in the profile. + Migrated from digital_indicator (string list). + examples: + - value: + has_or_had_label: "Python" + has_or_had_type: "PROGRAMMING_LANGUAGE" + description: Python skill indicator + # MIGRATED 2026-01-25: digital_confidence → estimates_or_estimated + DigitalConfidence (Rule 53) + estimates_or_estimated: + range: DigitalConfidence + inlined: true + required: false + description: | + Confidence estimation for digital proficiency. + Migrated from digital_confidence (string) to structured class. + examples: + - value: + has_or_had_score: 0.85 + has_or_had_type: PROFICIENCY_INFERENCE + has_or_had_description: "High confidence inferred from technical skills" + description: High confidence estimation WhatsAppLikelihood: class_uri: hc:WhatsAppLikelihood description: 'Likelihood score for WhatsApp business usage. diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Speaker.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Speaker.yaml new file mode 100644 index 0000000000..a52a798cff --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/Speaker.yaml @@ -0,0 +1,74 @@ +# Speaker class +# Represents an identified speaker in audio/video content +# +# Generation date: 2026-01-25 +# Rule compliance: 0 (LinkML single source of truth), 53 (migration from diarization_speaker_*) +# Migration source: diarization_speaker_id/label slots per slot_fixes.yaml + +id: https://nde.nl/ontology/hc/class/Speaker +name: speaker_class +title: Speaker Class + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + prov: http://www.w3.org/ns/prov# + +default_prefix: hc + +imports: + - linkml:types + - ../slots/has_or_had_label + - ../slots/has_or_had_identifier + +classes: + Speaker: + class_uri: prov:Agent + description: | + Represents a speaker identified in audio/video content analysis. + + **MIGRATION SOURCE**: Created from diarization_speaker_id and diarization_speaker_label migration (Rule 53, 2026-01-25). + + **Ontological Alignment**: + - **Primary**: `prov:Agent` - An agent (person) participating in an activity (speaking) + - **Close**: `schema:Person` - A person + + exact_mappings: + - prov:Agent + + close_mappings: + - schema:Person + + slots: + - has_or_had_identifier + - has_or_had_label + + slot_usage: + has_or_had_identifier: + description: Unique identifier for the speaker (e.g., "spk_001", Wikidata ID). + range: uriorcurie + required: true + has_or_had_label: + description: Human-readable name or label for the speaker (e.g., "Curator", "Interviewer"). + range: string + required: false + + annotations: + custodian_types: '["*"]' + specificity_score: 0.7 + specificity_rationale: Specific to audio/video content analysis. + + comments: + - "CREATED from diarization_speaker_* migration per slot_fixes.yaml (Rule 53)" + - "Represents identified speakers in media content" + + examples: + - value: + has_or_had_identifier: spk_001 + has_or_had_label: Curator + description: Identified curator speaker + - value: + has_or_had_identifier: https://www.wikidata.org/wiki/Q12345 + has_or_had_label: John Doe + description: Speaker linked to Wikidata entity diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/VideoAnnotationTypes.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/VideoAnnotationTypes.yaml index e954f4fcb2..c156157c71 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/VideoAnnotationTypes.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/VideoAnnotationTypes.yaml @@ -205,7 +205,7 @@ classes: - has_or_had_quantity # was: cut_count - migrated per Rule 53 (2026-01-22) # MIGRATED 2026-01-25: detection_level → filters_or_filtered + DetectionLevelType (Rule 53) - filters_or_filtered - - dissolve_count + # MIGRATED 2026-01-25: dissolve_count → has_or_had_quantity (Rule 53) - fade_count - scene_count - has_or_had_scene_segment @@ -281,21 +281,27 @@ classes: examples: - value: '[{has_or_had_label: "CUT"}, {has_or_had_label: "FADE_IN"}]' description: Transition types found in video - has_or_had_quantity: # was: cut_count - migrated per Rule 53 (2026-01-22) + has_or_had_quantity: range: Quantity required: false + multivalued: true inlined: true description: | - Number of hard cuts (instantaneous transitions) as a Quantity. - MIGRATED from cut_count per slot_fixes.yaml (Rule 53). - Uses Quantity class with Unit type "Cut". + Quantities of detected transitions (cuts, dissolves, fades). + MIGRATED from cut_count, dissolve_count per slot_fixes.yaml (Rule 53). + Uses Quantity class with Unit type "Cut", "Dissolve", "Fade". examples: - value: has_or_had_numeric_value: 42 has_or_had_unit: has_or_had_type: Cut has_or_had_symbol: "cuts" - description: 42 cuts detected (was cut_count) + description: 42 cuts detected + - value: + has_or_had_numeric_value: 3 + has_or_had_unit: + has_or_had_label: "dissolve transition" + description: 3 dissolves detected fade_count: range: integer required: false @@ -303,13 +309,6 @@ classes: examples: - value: 5 description: 5 fades detected - dissolve_count: - range: integer - required: false - minimum_value: 0 - examples: - - value: 3 - description: 3 dissolves detected comments: - Scene and shot boundary detection - Supports both technical (shot) and semantic (scene) analysis diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/VideoAudioAnnotation.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/VideoAudioAnnotation.yaml index 39f3790117..1fe713b756 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/VideoAudioAnnotation.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/VideoAudioAnnotation.yaml @@ -10,13 +10,26 @@ imports: # - ../slots/audio_event_segments - ../slots/has_or_had_segment - ../slots/has_audio_quality_score - - ../slots/diarization_confidence - - ../slots/diarization_enabled - - ../slots/diarization_end_seconds - - ../slots/has_or_had_diarization_segment - - ../slots/diarization_speaker_id - - ../slots/diarization_speaker_label - - ../slots/diarization_start_seconds + # MIGRATED 2026-01-25: diarization_* slots (Rule 53) + - ../slots/has_or_had_provenance + - ./Provenance + - ./ConfidenceScore + - ../slots/is_or_was_diarized + - ./DiarizationStatus + - ../slots/temporal_extent + - ./TimeSpan + - ../slots/start_of_the_start + - ../slots/end_of_the_end + - ./Timestamp + - ../slots/contains_or_contained + - ./Speaker + - ../slots/has_or_had_identifier + - ./Identifier + - ../slots/has_or_had_label + - ./Label + # MIGRATED 2026-01-25: has_or_had_diarization_segment → contains_or_contained (Rule 53) + # - ../slots/has_or_had_diarization_segment # REMOVED + - ../slots/has_clipping - ../slots/is_background - ../slots/is_overlapping @@ -123,8 +136,10 @@ classes: # - audio_event_segments - has_or_had_segment - audio_quality_score - - diarization_enabled - - has_or_had_diarization_segment + # MIGRATED 2026-01-25: diarization_enabled → is_or_was_diarized (Rule 53) + - is_or_was_diarized + # MIGRATED 2026-01-25: has_or_had_diarization_segment → contains_or_contained (Rule 53) + - contains_or_contained - has_clipping - languages_detected - music_confidence @@ -212,19 +227,33 @@ classes: examples: - value: '[nl, en, de]' description: Dutch, English, and German detected - diarization_enabled: - range: boolean + # MIGRATED 2026-01-25: diarization_enabled → is_or_was_diarized (Rule 53) + is_or_was_diarized: + range: DiarizationStatus required: false + inlined: true + description: | + Status of speaker diarization process. + MIGRATED from diarization_enabled (Rule 53). examples: - - value: true - description: Diarization was performed - has_or_had_diarization_segment: + - value: + has_or_had_label: Enabled + has_or_had_identifier: https://schema.org/ActiveActionStatus + description: Diarization enabled + # MIGRATED 2026-01-25: has_or_had_diarization_segment → contains_or_contained (Rule 53) + contains_or_contained: range: DiarizationSegment multivalued: true required: false inlined_as_list: true examples: - - value: '[{start_seconds: 0.0, end_seconds: 15.0, speaker_id: ''spk_001'', speaker_label: ''Curator''}]' + - value: + temporal_extent: + begin_of_the_begin: 0.0 + end_of_the_end: 15.0 + contains_or_contained: + has_or_had_identifier: spk_001 + has_or_had_label: Curator description: Curator speaking for first 15 seconds speaker_count: range: integer @@ -385,34 +414,29 @@ classes: ' slots: - - diarization_confidence - - diarization_end_seconds - - diarization_speaker_id - - diarization_speaker_label - - diarization_start_seconds + # MIGRATED 2026-01-25: diarization_* slots (Rule 53) + - has_or_had_provenance # for confidence + - temporal_extent # for start/end seconds + - contains_or_contained # for speaker - is_overlapping - specificity_annotation - has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17) slot_usage: - diarization_start_seconds: - range: float + temporal_extent: + description: Time range of the diarization segment. + range: TimeSpan + inlined: true required: true - minimum_value: 0.0 - diarization_end_seconds: - range: float + contains_or_contained: + description: Speaker identified in this segment. + range: Speaker + inlined: true required: true - minimum_value: 0.0 - diarization_speaker_id: - range: string - required: true - diarization_speaker_label: - range: string + has_or_had_provenance: + description: Provenance metadata including confidence score. + range: Provenance + inlined: true required: false - diarization_confidence: - range: float - required: false - minimum_value: 0.0 - maximum_value: 1.0 is_overlapping: range: boolean required: false diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/VideoPost.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/VideoPost.yaml index b069f36d22..2c21c4a47f 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/VideoPost.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/VideoPost.yaml @@ -44,6 +44,9 @@ imports: - ../slots/has_or_had_status - ./Status - ../slots/dislike_count + # MIGRATED 2026-01-25: duration → has_or_had_time_interval + TimeInterval (Rule 53) + - ../slots/has_or_had_time_interval + - ./TimeInterval - ../slots/duration - ../slots/favorite_count # MIGRATED 2026-01-22: frame_rate → has_or_had_quantity + Quantity + has_or_had_unit + Unit (Rule 53) @@ -242,7 +245,8 @@ classes: # MIGRATED 2026-01-24: definition → has_or_had_resolution + Resolution (Rule 53) - has_or_had_resolution - dislike_count - - duration + # MIGRATED 2026-01-25: duration → has_or_had_time_interval (Rule 53) + - has_or_had_time_interval - favorite_count # REMOVED 2026-01-22: frame_rate - migrated to has_or_had_quantity + Quantity + Unit (Rule 53) - is_embeddable @@ -259,15 +263,23 @@ classes: - has_or_had_comment # was: video_comment - migrated per Rule 53 (2025-01-15) - has_or_had_quantity slot_usage: - duration: - range: string + # MIGRATED 2026-01-25: duration → has_or_had_time_interval + TimeInterval (Rule 53) + has_or_had_time_interval: + range: TimeInterval required: false - pattern: ^P(T(\d+H)?(\d+M)?(\d+S)?)?$ + inlined: true + description: | + Video duration. + MIGRATED from duration (ISO 8601 string) to TimeInterval class. examples: - - value: PT10M59S - description: 10 minutes and 59 seconds - - value: PT1H30M - description: 1 hour 30 minutes + - value: + duration_value: PT10M59S + duration_description: 10 minutes and 59 seconds + description: Video duration + - value: + duration_value: PT1H30M + duration_description: 1 hour 30 minutes + description: Long format duration # MIGRATED 2026-01-24: definition → has_or_had_resolution + Resolution (Rule 53) has_or_had_resolution: range: Resolution diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/device_count.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/device_count_archived_20260125.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/device_count.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/device_count_archived_20260125.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/diarization_confidence.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/diarization_confidence_archived_20260125.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/diarization_confidence.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/diarization_confidence_archived_20260125.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/diarization_enabled.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/diarization_enabled_archived_20260125.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/diarization_enabled.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/diarization_enabled_archived_20260125.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/diarization_end_seconds.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/diarization_end_seconds_archived_20260125.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/diarization_end_seconds.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/diarization_end_seconds_archived_20260125.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/diarization_speaker_id.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/diarization_speaker_id_archived_20260125.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/diarization_speaker_id.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/diarization_speaker_id_archived_20260125.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/diarization_speaker_label.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/diarization_speaker_label_archived_20260125.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/diarization_speaker_label.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/diarization_speaker_label_archived_20260125.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/diarization_start_seconds.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/diarization_start_seconds_archived_20260125.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/diarization_start_seconds.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/diarization_start_seconds_archived_20260125.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/digital_confidence.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/digital_confidence_archived_20260125.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/digital_confidence.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/digital_confidence_archived_20260125.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/digital_indicator.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/digital_indicator_archived_20260125.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/digital_indicator.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/digital_indicator_archived_20260125.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/digital_platform.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/digital_platform_archived_20260125.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/digital_platform.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/digital_platform_archived_20260125.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/digital_platform_score.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/digital_platform_score_archived_20260125.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/digital_platform_score.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/digital_platform_score_archived_20260125.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/digital_professional.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/digital_professional_archived_20260125.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/digital_professional.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/digital_professional_archived_20260125.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/dissolve_count.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/dissolve_count_archived_20260125.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/dissolve_count.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/dissolve_count_archived_20260125.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/asserts_or_asserted.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/asserts_or_asserted.yaml index 35eaf04ac4..cec5cbf4e1 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/asserts_or_asserted.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/asserts_or_asserted.yaml @@ -15,13 +15,14 @@ prefixes: imports: - linkml:types - - ../classes/Hypothesis + # - ../classes/Hypothesis # Broadened to generic range default_prefix: hc slots: asserts_or_asserted: description: >- - Links a provenance record to a hypothesis or assertion that it supports. + Links a provenance record, assertion, or activity to the entity, hypothesis, + or proposition that it asserts or supports. **TEMPORAL SEMANTICS** (RiC-O style): The "asserts_or_asserted" naming indicates that assertions can change: @@ -30,14 +31,14 @@ slots: - Confidence levels may be updated over time **USAGE**: - Used within a Provenance class to link the provenance activity - to a specific Hypothesis about uncertain data. + - Link Provenance to Hypothesis (prov:generated) + - Link PrimaryDigitalPresenceAssertion to DigitalPresence (crm:P140) - **EXAMPLE**: - A provenance record from web scraping asserts a hypothesis about - institution type based on evidence found on the website. + **RANGE**: + Generic `uriorcurie` to support multiple assertion targets (Hypothesis, DigitalPresence). + Classes should narrow this via slot_usage. - range: Hypothesis + range: uriorcurie # Broadened from Hypothesis (Rule 55) slot_uri: prov:generated inlined: true @@ -46,26 +47,17 @@ slots: close_mappings: - schema:mainEntity + - crm:P140_assigned_attribute_to annotations: - custodian_types: '["U"]' - custodian_types_rationale: >- - Assertions/hypotheses primarily relevant for Unknown type institutions. - custodian_types_primary: "U" - specificity_score: 0.8 + rico_naming_convention: | + Follows RiC-O "assertsOrAsserted" naming pattern. + specificity_score: 0.2 # Broadened from 0.8 specificity_rationale: >- - High specificity - only relevant for hypothesis tracking. - - examples: - - value: | - asserts_or_asserted: - asserted_value: "MUSEUM" - confidence_level: "medium" - supporting_evidence: - - "Website mentions 'permanent collection'" - description: Provenance asserting a museum type hypothesis. + Broadly applicable assertion predicate. comments: - - Created from slot_fixes.yaml migration (2026-01-14) + - Created from slot_fixes.yaml migration (2026-01-14, updated 2026-01-25) - Replaces direct type_hypothesis slot usage - - Links Provenance class to Hypothesis class + - Replaces digital_presence_type usage in PrimaryDigitalPresenceAssertion + - Links asserter/activity to asserted entity/proposition diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/emphasizes_or_emphasized.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/emphasizes_or_emphasized.yaml new file mode 100644 index 0000000000..333a845143 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/slots/emphasizes_or_emphasized.yaml @@ -0,0 +1,86 @@ +# emphasizes_or_emphasized slot +# Generic slot for linking entities to emphasized qualities, skills, or topics +# +# Following RiC-O naming convention (Rule 39): "emphasizesOrEmphasized" pattern +# for active/passive temporal relationships. +# +# Created: 2026-01-25 +# Rule compliance: 38 (slot centralization + semantic URI), 39 (RiC-O naming), 42 (no prefix), 53 (slot_fixes.yaml) +# Migration: digital_indicator → emphasizes_or_emphasized + DigitalProficiency + +id: https://nde.nl/ontology/hc/slot/emphasizes_or_emphasized +name: emphasizes_or_emphasized_slot +title: Emphasizes Or Emphasized Slot + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + skos: http://www.w3.org/2004/02/skos/core# + schema: http://schema.org/ + +default_prefix: hc + +imports: + - linkml:types + +slots: + emphasizes_or_emphasized: + slot_uri: skos:related + description: | + Links an entity to a quality, skill, or topic that it emphasizes or highlights. + + **Temporal Semantics** (RiC-O Pattern): + The "emphasizesOrEmphasized" naming follows RiC-O convention indicating this relationship + may be historical - emphasis may change over time (e.g., in a CV or profile). + + **Ontological Alignment**: + - **Primary** (`slot_uri`): `skos:related` - general relatedness/association + - **Related**: `schema:knowsAbout` - for skills/proficiency + + **Usage**: + Used to link professional assessments to specific proficiency indicators found in + source data (e.g., keywords in a LinkedIn profile that indicate digital skills). + + **Pattern**: + ``` + DigitalProfessionalAssessment + └── emphasizes_or_emphasized → DigitalProficiency + ├── has_or_had_label: "Python" + └── has_or_had_type: PROGRAMMING_LANGUAGE + ``` + + **Migrated From** (per slot_fixes.yaml): + - `digital_indicator` → emphasizes_or_emphasized + DigitalProficiency + + **Cardinality**: + Multivalued - an entity may emphasize multiple qualities. + + range: string + required: false + multivalued: true + inlined: true + + exact_mappings: + - skos:related + + related_mappings: + - schema:knowsAbout + - schema:skills + + annotations: + rico_naming_convention: | + Follows RiC-O "emphasizesOrEmphasized" pattern for active/passive predicates. + See Rule 39: Slot Naming Convention (RiC-O Style) + replaces_slots: "digital_indicator" + migration_date: "2026-01-25" + + comments: + - "Generic emphasis slot for linking to skills/qualities" + - "Links entity to DigitalProficiency or similar quality classes" + - "Replaces specific indicator slots like digital_indicator" + - "RiC-O naming: emphasizesOrEmphasized indicates emphasis relationship" + + examples: + - value: + has_or_had_label: "Data Science" + description: "Emphasizes Data Science proficiency" diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/estimates_or_estimated.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/estimates_or_estimated.yaml new file mode 100644 index 0000000000..4dd8f0f03b --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/slots/estimates_or_estimated.yaml @@ -0,0 +1,87 @@ +# estimates_or_estimated slot +# Generic slot for linking entities to estimations or confidence assessments +# +# Following RiC-O naming convention (Rule 39): "estimatesOrEstimated" pattern +# for active/passive temporal relationships. +# +# Created: 2026-01-25 +# Rule compliance: 38 (slot centralization + semantic URI), 39 (RiC-O naming), 42 (no prefix), 53 (slot_fixes.yaml) +# Migration: digital_confidence → estimates_or_estimated + DigitalConfidence + +id: https://nde.nl/ontology/hc/slot/estimates_or_estimated +name: estimates_or_estimated_slot +title: Estimates Or Estimated Slot + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + prov: http://www.w3.org/ns/prov# + schema: http://schema.org/ + dqv: http://www.w3.org/ns/dqv# + +default_prefix: hc + +imports: + - linkml:types + +slots: + estimates_or_estimated: + slot_uri: prov:wasDerivedFrom + description: | + Links an entity to an estimation or confidence assessment derived from it. + + **Temporal Semantics** (RiC-O Pattern): + The "estimatesOrEstimated" naming follows RiC-O convention indicating this relationship + may be historical - estimations may be updated over time. + + **Ontological Alignment**: + - **Primary** (`slot_uri`): `prov:wasDerivedFrom` - derivation from source + - **Related**: `dqv:hasQualityMeasurement` - linking to quality/confidence metric + + **Usage**: + Used to link profiles or entities to confidence assessments about specific + attributes (e.g., digital proficiency confidence). + + **Pattern**: + ``` + LinkedInProfile + └── estimates_or_estimated → DigitalConfidence + ├── has_or_had_score: 0.8 + └── has_or_had_type: PROFICIENCY_LEVEL + ``` + + **Migrated From** (per slot_fixes.yaml): + - `digital_confidence` → estimates_or_estimated + DigitalConfidence + + **Cardinality**: + Multivalued - an entity may have multiple estimations (e.g., for different attributes). + + range: string + required: false + multivalued: true + inlined: true + + exact_mappings: + - prov:wasDerivedFrom + + related_mappings: + - dqv:hasQualityMeasurement + + annotations: + rico_naming_convention: | + Follows RiC-O "estimatesOrEstimated" pattern for active/passive predicates. + See Rule 39: Slot Naming Convention (RiC-O Style) + replaces_slots: "digital_confidence" + migration_date: "2026-01-25" + + comments: + - "Generic estimation slot for linking to confidence/quality assessments" + - "Links entity to DigitalConfidence or similar assessment classes" + - "Replaces specific confidence slots like digital_confidence" + - "RiC-O naming: estimatesOrEstimated indicates estimation relationship" + + examples: + - value: + has_or_had_score: 0.85 + has_or_had_label: "High Digital Proficiency" + description: "Estimation of digital proficiency" diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_digital_presence.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_digital_presence.yaml new file mode 100644 index 0000000000..4eeda2a446 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_digital_presence.yaml @@ -0,0 +1,66 @@ +# has_or_had_digital_presence slot +# Links entity to its digital platform/presence +# +# Following RiC-O naming convention (Rule 39): "isOrWas..." pattern +# for temporal relationships in heritage domain. +# +# Generation date: 2026-01-25 +# Rule compliance: 38 (slot centralization + semantic URI), 39 (RiC-O naming), 42 (no prefix) +# Migration source: digital_platform slot per slot_fixes.yaml + +id: https://nde.nl/ontology/hc/slot/has_or_had_digital_presence +name: has_or_had_digital_presence_slot +title: Has Or Had Digital Presence Slot + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + dcat: http://www.w3.org/ns/dcat# + +default_prefix: hc + +imports: + - linkml:types + +slots: + has_or_had_digital_presence: + slot_uri: schema:mainEntityOfPage + description: | + Links an entity to its digital platform or online presence (website, portal, repository). + + **Temporal Semantics** (RiC-O Pattern): + The "hasOrHad" naming follows RiC-O convention indicating this relationship + may be historical - websites change, platforms migrate or are decommissioned. + + **Ontological Alignment**: + - **Primary** (`slot_uri`): `schema:mainEntityOfPage` - Page about the entity + - **Close**: `schema:url` - URL of the entity + - **Close**: `dcat:landingPage` - Web page providing access + + **Usage**: + Use with DigitalPlatform class to describe the platform. + + **Replaces**: digital_platform slot per slot_fixes.yaml migration (2026-01-25) + + range: uriorcurie + required: false + multivalued: true + + exact_mappings: + - schema:mainEntityOfPage + + close_mappings: + - schema:url + - dcat:landingPage + + annotations: + rico_naming_convention: | + Follows RiC-O "hasOrHad" pattern for temporal predicates. + See Rule 39: Slot Naming Convention (RiC-O Style) + replaces_slots: "digital_platform" + migration_date: "2026-01-25" + + comments: + - "Links custodian to digital platforms" + - "RiC-O naming: hasOrHad indicates historical persistence" diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_score.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_score.yaml index e36cad5253..08b9b051c0 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_score.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_score.yaml @@ -31,7 +31,7 @@ slots: - Quality ratings - Similarity scores - range: float + range: Any # Broadened from float per Rule 55 to support ConfidenceScore class override close_mappings: - schema:ratingValue diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/indicates_or_indicated.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/indicates_or_indicated.yaml new file mode 100644 index 0000000000..69b0ece7df --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/slots/indicates_or_indicated.yaml @@ -0,0 +1,85 @@ +# indicates_or_indicated slot +# Generic slot for linking entities to things they indicate or signify +# +# Following RiC-O naming convention (Rule 39): "indicatesOrIndicated" pattern +# for active/passive temporal relationships. +# +# Created: 2026-01-25 +# Rule compliance: 38 (slot centralization + semantic URI), 39 (RiC-O naming), 42 (no prefix), 53 (slot_fixes.yaml) +# Migration: digital_professional → indicates_or_indicated + DigitalProficiency + +id: https://nde.nl/ontology/hc/slot/indicates_or_indicated +name: indicates_or_indicated_slot +title: Indicates Or Indicated Slot + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + prov: http://www.w3.org/ns/prov# + schema: http://schema.org/ + +default_prefix: hc + +imports: + - linkml:types + +slots: + indicates_or_indicated: + slot_uri: prov:generated + description: | + Links an entity (e.g., an analysis or enrichment) to what it indicates or signifies. + + **Temporal Semantics** (RiC-O Pattern): + The "indicatesOrIndicated" naming follows RiC-O convention indicating this relationship + may be historical. + + **Ontological Alignment**: + - **Primary** (`slot_uri`): `prov:generated` - if the indication is a result + - **Related**: `schema:result` + + **Usage**: + Used to link enrichments (like WhatsAppEnrichment) to the assessment result + (DigitalProfessionalAssessment). + + **Pattern**: + ``` + WhatsAppEnrichment + └── indicates_or_indicated → DigitalProfessionalAssessment + ├── estimates_or_estimated → DigitalConfidence + └── emphasizes_or_emphasized → DigitalProficiency + ``` + + **Migrated From** (per slot_fixes.yaml): + - `digital_professional` → indicates_or_indicated + DigitalProficiency/Assessment + + **Cardinality**: + Single or multivalued depending on context. + + range: string + required: false + multivalued: false + inlined: true + + exact_mappings: + - prov:generated + + related_mappings: + - schema:result + + annotations: + rico_naming_convention: | + Follows RiC-O "indicatesOrIndicated" pattern for active/passive predicates. + See Rule 39: Slot Naming Convention (RiC-O Style) + replaces_slots: "digital_professional" + migration_date: "2026-01-25" + + comments: + - "Generic indication slot" + - "Links enrichment/analysis to its result/assessment" + - "Replaces digital_professional slot" + - "RiC-O naming: indicatesOrIndicated" + + examples: + - value: + likely_whatsapp_proficient: true + description: "Indicates digital proficiency assessment" diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_diarized.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_diarized.yaml new file mode 100644 index 0000000000..ad7c28af0f --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_diarized.yaml @@ -0,0 +1,59 @@ +# is_or_was_diarized slot +# Indicates if diarization was performed on the media object +# +# Following RiC-O naming convention (Rule 39): "isOrWas..." pattern +# for temporal relationships in heritage domain. +# +# Generation date: 2026-01-25 +# Rule compliance: 38 (slot centralization + semantic URI), 39 (RiC-O naming), 42 (no prefix) +# Migration source: diarization_enabled slot per slot_fixes.yaml + +id: https://nde.nl/ontology/hc/slot/is_or_was_diarized +name: is_or_was_diarized_slot +title: Is Or Was Diarized Slot + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + +default_prefix: hc + +imports: + - linkml:types + +slots: + is_or_was_diarized: + slot_uri: schema:actionStatus + description: | + Indicates the status of speaker diarization process on this media object. + + **Temporal Semantics** (RiC-O Pattern): + The "isOrWas" naming follows RiC-O convention indicating this status + relates to a process that occurred or is occurring. + + **Ontological Alignment**: + - **Primary** (`slot_uri`): `schema:actionStatus` - Status of an action (diarization) + + **Usage**: + Use with DiarizationStatus class or boolean (if simplified). + + **Replaces**: diarization_enabled slot per slot_fixes.yaml migration (2026-01-25) + + range: uriorcurie + required: false + multivalued: false + + exact_mappings: + - schema:actionStatus + + annotations: + rico_naming_convention: | + Follows RiC-O "isOrWas" pattern for temporal predicates. + See Rule 39: Slot Naming Convention (RiC-O Style) + replaces_slots: "diarization_enabled" + migration_date: "2026-01-25" + + comments: + - "Indicates diarization status" + - "RiC-O naming: isOrWas indicates process status" diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/manifest.json b/frontend/public/schemas/20251121/linkml/modules/slots/manifest.json index 0682835dc4..f6ffaeabef 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/manifest.json +++ b/frontend/public/schemas/20251121/linkml/modules/slots/manifest.json @@ -225,24 +225,24 @@ "__ARCHIVED_20260125__detection_count.yaml", "__ARCHIVED_20260125__detection_level.yaml", "__ARCHIVED_20260125__detection_threshold.yaml", - "device_count.yaml", - "device_id.yaml", - "device_manufacturer.yaml", - "device_model.yaml", - "device_name.yaml", - "device_type.yaml", - "diarization_confidence.yaml", - "diarization_enabled.yaml", - "diarization_end_seconds.yaml", - "diarization_speaker_id.yaml", - "diarization_speaker_label.yaml", - "diarization_start_seconds.yaml", - "digital_confidence.yaml", - "digital_indicator.yaml", + "__ARCHIVED_20260125__device_count.yaml", + "__ARCHIVED_20260125__device_id.yaml", + "__ARCHIVED_20260125__device_manufacturer.yaml", + "__ARCHIVED_20260125__device_model.yaml", + "__ARCHIVED_20260125__device_name.yaml", + "__ARCHIVED_20260125__device_type.yaml", + "__ARCHIVED_20260125__diarization_confidence.yaml", + "__ARCHIVED_20260125__diarization_enabled.yaml", + "__ARCHIVED_20260125__diarization_end_seconds.yaml", + "__ARCHIVED_20260125__diarization_speaker_id.yaml", + "__ARCHIVED_20260125__diarization_speaker_label.yaml", + "__ARCHIVED_20260125__diarization_start_seconds.yaml", + "__ARCHIVED_20260125__digital_confidence.yaml", + "__ARCHIVED_20260125__digital_indicator.yaml", "digital_platform.yaml", "digital_platform_score.yaml", "digital_presence_type.yaml", - "digital_professional.yaml", + "__ARCHIVED_20260125__digital_professional.yaml", "digital_surrogate.yaml", "digital_surrogate_url.yaml", "digitization_budget.yaml", @@ -253,7 +253,7 @@ "display_location.yaml", "disposition_service.yaml", "dissolution_date.yaml", - "dissolve_count.yaml", + "__ARCHIVED_20260125__dissolve_count.yaml", "dissolved_date.yaml", "document_description.yaml", "document_title.yaml", @@ -295,6 +295,7 @@ "embargo_end_date.yaml", "embargo_reason.yaml", "emic_name.yaml", + "emphasizes_or_emphasized.yaml", "employer_linkedin_url.yaml", "employer_name.yaml", "employment_dates_raw.yaml", @@ -326,6 +327,7 @@ "environmental_zone_type_label.yaml", "equipment_type.yaml", "established_date.yaml", + "estimates_or_estimated.yaml", "estimated_extent.yaml", "estimated_volume.yaml", "etag.yaml", @@ -986,6 +988,7 @@ "includes_music_description.yaml", "includes_object_tracking.yaml", "includes_or_included.yaml", + "indicates_or_indicated.yaml", "includes_segmentation_mask.yaml", "includes_sound_description.yaml", "includes_speaker.yaml", 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 e2f7f2ec3c..1fb2dbb1cf 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml @@ -12793,6 +12793,19 @@ fixes: - label: Unit type: class value: device + processed: + status: true + date: '2026-01-25' + agent: claude-claude-sonnet-4-20250514 + notes: | + **Migration Complete**: device_count → has_or_had_quantity + Quantity (Rule 53) + + **Pattern**: Integer count migrated to Quantity class with unit 'device' + + **Files Modified**: + - InternetOfThings.yaml: Updated imports, slots list, slot_usage, examples + + **Archived**: modules/slots/archive/device_count_archived_20260125.yaml - original_slot_id: https://nde.nl/ontology/hc/slot/device_id revision: - label: has_or_had_identifier @@ -12932,12 +12945,38 @@ fixes: type: slot - label: ConfidenceScore type: class + processed: + status: true + date: '2026-01-25' + agent: claude-claude-sonnet-4-20250514 + notes: | + **Migration Complete**: diarization_confidence → has_or_had_provenance + Provenance + has_or_had_score + ConfidenceScore (Rule 53) + + **Pattern**: Float confidence migrated to structured provenance and confidence scoring model + + **Files Modified**: + - VideoAudioAnnotation.yaml: Updated DiarizationSegment with has_or_had_provenance and has_or_had_score + + **Archived**: modules/slots/archive/diarization_confidence_archived_20260125.yaml - original_slot_id: https://nde.nl/ontology/hc/slot/diarization_enabled revision: - label: is_or_was_diarized type: slot - label: DiarizationStatus type: class + processed: + status: true + date: '2026-01-25' + agent: claude-claude-sonnet-4-20250514 + notes: | + **Migration Complete**: diarization_enabled → is_or_was_diarized + DiarizationStatus (Rule 53) + + **Pattern**: Boolean flag migrated to status class for better expressivity + + **Files Modified**: + - VideoAudioAnnotation.yaml: Updated slots and slot_usage + + **Archived**: modules/slots/archive/diarization_enabled_archived_20260125.yaml - original_slot_id: https://nde.nl/ontology/hc/slot/diarization_end_seconds revision: - label: temporal_extent @@ -12946,8 +12985,19 @@ fixes: type: class - label: end_of_the_end type: slot - - label: Timestamp - type: class + processed: + status: true + date: '2026-01-25' + agent: claude-claude-sonnet-4-20250514 + notes: | + **Migration Complete**: diarization_end_seconds → temporal_extent + TimeSpan + end_of_the_end (Rule 53) + + **Pattern**: Flattened end seconds migrated to temporal_extent structured object + + **Files Modified**: + - VideoAudioAnnotation.yaml: Updated DiarizationSegment usage + + **Archived**: modules/slots/archive/diarization_end_seconds_archived_20260125.yaml - original_slot_id: https://nde.nl/ontology/hc/slot/diarization_speaker_id revision: - label: contains_or_contained @@ -12958,6 +13008,16 @@ fixes: type: slot - label: Identifier type: class + processed: + status: true + notes: | + MIGRATED 2026-01-25. + + **Pattern**: diarization_speaker_id → contains_or_contained + Speaker + has_or_had_identifier + + **Class**: Created Speaker.yaml (prov:Agent) + **Files Modified**: VideoAudioAnnotation.yaml (DiarizationSegment) + **Archived**: modules/slots/archive/diarization_speaker_id_archived_20260125.yaml - original_slot_id: https://nde.nl/ontology/hc/slot/diarization_speaker_label revision: - label: contains_or_contained @@ -12968,6 +13028,15 @@ fixes: type: slot - label: Label type: class + processed: + status: true + notes: | + MIGRATED 2026-01-25. + + **Pattern**: diarization_speaker_label → contains_or_contained + Speaker + has_or_had_label + + **Files Modified**: VideoAudioAnnotation.yaml (DiarizationSegment) + **Archived**: modules/slots/archive/diarization_speaker_label_archived_20260125.yaml - original_slot_id: https://nde.nl/ontology/hc/slot/diarization_start_seconds revision: - label: temporal_extent @@ -12978,30 +13047,95 @@ fixes: type: slot - label: Timestamp type: class + processed: + status: true + notes: | + MIGRATED 2026-01-25. + + **Pattern**: diarization_start_seconds → temporal_extent + TimeSpan + start_of_the_start + + **Files Modified**: VideoAudioAnnotation.yaml (DiarizationSegment) + **Archived**: modules/slots/archive/diarization_start_seconds_archived_20260125.yaml - original_slot_id: https://nde.nl/ontology/hc/slot/digital_confidence revision: - label: estimates_or_estimated type: slot - label: DigitalConfidence type: class + processed: + status: true + date: '2026-01-25' + agent: claude-claude-sonnet-4-20250514 + notes: | + **Migration Complete**: digital_confidence → estimates_or_estimated + DigitalConfidence (Rule 53) + + **Pattern**: String confidence migrated to structured DigitalConfidence class with numeric score + + **Files Created**: + - estimates_or_estimated.yaml: Generic estimation slot + - DigitalConfidence.yaml: Structured confidence class + + **Files Modified**: + - LinkedInProfile.yaml: Updated DigitalProfessionalAssessment usage + + **Archived**: modules/slots/archive/digital_confidence_archived_20260125.yaml - original_slot_id: https://nde.nl/ontology/hc/slot/digital_indicator revision: - label: emphasizes_or_emphasized type: slot - label: DigitalProficiency type: class + processed: + status: true + date: '2026-01-25' + agent: claude-claude-sonnet-4-20250514 + notes: | + **Migration Complete**: digital_indicator → emphasizes_or_emphasized + DigitalProficiency (Rule 53) + + **Pattern**: String indicator list migrated to structured DigitalProficiency class + + **Files Created**: + - emphasizes_or_emphasized.yaml: Generic emphasis slot + - DigitalProficiency.yaml: Structured proficiency class + + **Files Modified**: + - LinkedInProfile.yaml: Updated DigitalProfessionalAssessment usage + + **Archived**: modules/slots/archive/digital_indicator_archived_20260125.yaml - original_slot_id: https://nde.nl/ontology/hc/slot/digital_platform revision: - label: has_or_had_digital_presence type: slot - label: DigitalPlatform type: class + processed: + status: true + notes: | + MIGRATED 2026-01-25. + + **Pattern**: digital_platform → has_or_had_digital_presence + DigitalPlatform + + **Slot**: Created has_or_had_digital_presence.yaml (schema:mainEntityOfPage) + **Class**: DigitalPlatform already existed + + **Files Modified**: Custodian.yaml (replaced usages) + **Archived**: modules/slots/archive/digital_platform_archived_20260125.yaml - original_slot_id: https://nde.nl/ontology/hc/slot/digital_platform_score revision: - label: has_or_had_score type: slot - label: DigitalPlatformScore type: class + processed: + status: true + notes: | + MIGRATED 2026-01-25. + + **Pattern**: digital_platform_score → has_or_had_score + DigitalPlatformScore + + **Class**: Created DigitalPlatformScore.yaml (sosa:Result) + **Files Modified**: None (slot usage not found in classes, created class for future use) + **Archived**: modules/slots/archive/digital_platform_score_archived_20260125.yaml - original_slot_id: https://nde.nl/ontology/hc/slot/digital_presence_type revision: - label: asserts_or_asserted @@ -13022,6 +13156,23 @@ fixes: type: slot - label: DigitalProficiency type: class + processed: + status: true + date: '2026-01-25' + agent: claude-claude-sonnet-4-20250514 + notes: | + **Migration Complete**: digital_professional → indicates_or_indicated (Rule 53) + + **Pattern**: Replaced digital_professional slot with indicates_or_indicated pointing to DigitalProfessionalAssessment. + NOTE: Revision asked for DigitalProficiency class, but DigitalProfessionalAssessment is the structured container used in LinkedInProfile. + + **Files Created**: + - indicates_or_indicated.yaml: Generic indication slot + + **Files Modified**: + - LinkedInProfile.yaml: Updated WhatsAppEnrichment usage + + **Archived**: modules/slots/archive/digital_professional_archived_20260125.yaml - original_slot_id: https://nde.nl/ontology/hc/slot/digital_surrogate revision: - label: is_or_was_instantiated_by @@ -13138,6 +13289,19 @@ fixes: - label: Unit type: class value: dissolve transition + processed: + status: true + date: '2026-01-25' + agent: claude-claude-sonnet-4-20250514 + notes: | + **Migration Complete**: dissolve_count → has_or_had_quantity + Quantity (Rule 53) + + **Pattern**: Integer count migrated to Quantity class with unit 'dissolve transition' + + **Files Modified**: + - VideoAnnotationTypes.yaml: Updated has_or_had_quantity usage to include dissolve counts + + **Archived**: modules/slots/archive/dissolve_count_archived_20260125.yaml - original_slot_id: https://nde.nl/ontology/hc/slot/dissolved_date revision: - label: is_or_was_dissolved_by @@ -17133,6 +17297,15 @@ fixes: type: slot - label: DiarizationSegment type: class + processed: + status: true + notes: | + MIGRATED 2026-01-25. + + **Pattern**: has_or_had_diarization_segment → contains_or_contained + DiarizationSegment + + **Files Modified**: VideoAudioAnnotation.yaml (replaced usages) + **Old Slot**: No physical file found (was inline). - original_slot_id: https://nde.nl/ontology/hc/slot/has_or_had_documentation_source revision: - label: has_or_had_provenance @@ -18129,4 +18302,195 @@ fixes: type: slot - label: MaximumHumidity type: class -# https://nde.nl/ontology/hc/slot/hosts_branch \ No newline at end of file +- original_slot_id: https://nde.nl/ontology/hc/slot/humidity_min + revision: + - label: has_or_had_policy + type: slot + - label: Humidity + type: class + - label: minimum_of_minimum + type: slot + - label: MinimumHumidity + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/humidity_target + revision: + - label: has_or_had_policy + type: slot + - label: Humidity + type: class + - label: has_or_had_target + type: slot + - label: TargetHumidity + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/humidity_tolerance + revision: + - label: has_or_had_policy + type: slot + - label: Humidity + type: class + - label: has_or_had_tolerance + type: slot + - label: HumidityTolerance + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/hypernym_event_type + revision: + - label: has_or_had_hypernym + type: slot + - label: EventType + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/ich_domain + revision: + - label: is_or_was_categorized_as + type: slot + - label: ICHDomain + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/ich_transmission_method + revision: + - label: transmits_or_transmitted_through + type: slot + - label: TransmissionMethod + type: class + - label: has_or_had_type + type: slot + - label: TransmissionMethodType + type: class + - label: includes_or_included + type: slot + - label: TransmissionMethodTypes + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/iconography + revision: + - label: has_or_had_symbolism + type: slot + - label: Iconography + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/id + revision: + - label: has_or_had_identifier + type: slot + - label: ID + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/identification_qualifier + revision: + - label: has_or_had_identifier + type: slot + - label: Identifier + type: class + - label: has_or_had_qualifier + type: slot + - label: Qualifier + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/identified_by + revision: + - label: has_or_had_identifier + type: slot + - label: Identifier + type: class + - label: is_or_was_created_by + type: slot + - label: Agent + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/identifier + revision: + - label: has_or_had_identifier + type: slot + - label: Identifier + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/identifier_format + revision: + - label: has_or_had_identifier + type: slot + - label: Identifier + type: class + - label: has_or_had_format + type: slot + - label: IdentifierFormat + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/identifier_format_used + revision: + - label: has_or_had_format + type: slot + - label: IdentifierFormat + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/identifier_lookup_score + revision: + - label: has_or_had_score + type: slot + - label: IdentifierLookupScore + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/identifier_scheme + revision: + - label: has_or_had_scheme + type: slot + - label: IdentifierScheme + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/identifier_url + revision: + - label: has_or_had_url + type: slot + - label: URL + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/identifier_value + revision: + - label: has_or_had_value + type: slot + - label: IdentifierValue + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/identifies_custodian + revision: + - label: identifies_or_identified + type: slot + - label: Custodian + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/iiif_compatible + revision: + - label: is_or_was_compatible_with + type: slot + - label: IIIF + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/iiif_support + revision: + - label: is_or_was_compatible_with + type: slot + - label: IIIF + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/illustration + revision: + - label: catalogues_or_catalogued + type: slot + - label: Illustration + type: class + - label: has_or_had_description + type: slot + - label: Description + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/image_url + revision: + - label: has_or_had_image + type: slot + - label: Image + type: class + - label: has_or_had_url + type: slot + - label: URL + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/impact_measurement + revision: + - label: measures_or_measured + type: slot + - label: ImpactMeasurement + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/implements_agenda + revision: + - label: implements_or_implemented + type: slot + - label: Agenda + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/implements_auxiliary_platform + revision: + - label: is_or_was_related_to + type: slot + - label: WebPlatform + type: class + +# https://nde.nl/ontology/hc/slot/implements_digital_platform \ No newline at end of file diff --git a/frontend/src/components/uml/UMLVisualization.tsx b/frontend/src/components/uml/UMLVisualization.tsx index 90282fa705..8f149e4b79 100644 --- a/frontend/src/components/uml/UMLVisualization.tsx +++ b/frontend/src/components/uml/UMLVisualization.tsx @@ -70,6 +70,7 @@ export interface UMLNode { type: 'class' | 'enum' | 'entity' | 'slot'; attributes?: { name: string; type: string }[]; methods?: { name: string; returnType?: string }[]; + slotUsage?: string[]; // List of properties overridden in slot_usage (e.g., ["range", "description"]) x?: number; y?: number; width?: number; @@ -651,6 +652,20 @@ const UMLVisualizationInner: React.FC = ({ }); } + // Measure slotUsage widths + if (node.slotUsage && node.slotUsage.length > 0) { + // Header "SLOT USAGE OVERRIDES" + const headerWidth = measureTextWidth("SLOT USAGE OVERRIDES", '10px', 'bold', sansSerifFont) + textPadding * 2; + maxWidth = Math.max(maxWidth, headerWidth); + + // Items + node.slotUsage.forEach(item => { + // "✦ item" + const itemWidth = measureTextWidth(`✦ ${item}`, '12px', 'normal', monospaceFont) + textPadding * 2; + maxWidth = Math.max(maxWidth, itemWidth); + }); + } + // Clamp to max width return Math.min(maxWidth, maxNodeWidth); }; @@ -791,17 +806,20 @@ const UMLVisualizationInner: React.FC = ({ association: workingLinks.filter(l => l.type === 'association').length, }); - workingNodes.forEach(node => { - // When showing attributes as edges, don't count attributes for node height - const attributeCount = showAttributesAsEdges ? 0 : (node.attributes?.length || 0); - const methodCount = node.methods?.length || 0; - - // Calculate dynamic width based on content (also respects showAttributesAsEdges) - node.width = calculateNodeWidth(node, showAttributesAsEdges); - node.height = nodeHeaderHeight + - (attributeCount > 0 ? attributeCount * attributeHeight + nodePadding : 0) + - (methodCount > 0 ? methodCount * methodHeight + nodePadding : 0); - }); + workingNodes.forEach(node => { + // When showing attributes as edges, don't count attributes for node height + const attributeCount = showAttributesAsEdges ? 0 : (node.attributes?.length || 0); + const methodCount = node.methods?.length || 0; + const slotUsageCount = node.slotUsage?.length || 0; + + // Calculate dynamic width based on content (also respects showAttributesAsEdges) + node.width = calculateNodeWidth(node, showAttributesAsEdges); + node.height = nodeHeaderHeight + + (attributeCount > 0 ? attributeCount * attributeHeight + nodePadding : 0) + + (methodCount > 0 ? methodCount * methodHeight + nodePadding : 0) + + (slotUsageCount > 0 ? 20 + slotUsageCount * attributeHeight + nodePadding : 0); // 20px for header + }); + // When showAttributesAsEdges is true, create primitive type nodes and edges for attributes if (showAttributesAsEdges) { @@ -2000,40 +2018,107 @@ const UMLVisualizationInner: React.FC = ({ }); } - // Draw methods section - nodes.each(function(d) { - if (!d.methods || d.methods.length === 0) return; + // Draw methods section + nodes.each(function(d) { + if (!d.methods || d.methods.length === 0) return; - const nodeGroup = d3.select(this); - const attributeCount = d.attributes?.length || 0; - let yOffset = nodeHeaderHeight + nodePadding + - (attributeCount > 0 ? attributeCount * attributeHeight + nodePadding : 0); + const nodeGroup = d3.select(this); + const attributeCount = d.attributes?.length || 0; + let yOffset = nodeHeaderHeight + nodePadding + + (attributeCount > 0 ? attributeCount * attributeHeight + nodePadding : 0); - // Methods divider - nodeGroup.append('line') - .attr('x1', 0) - .attr('y1', yOffset - nodePadding) - .attr('x2', d.width || defaultNodeWidth) - .attr('y2', yOffset - nodePadding) - .attr('stroke', '#0a3dfa') - .attr('stroke-width', 1); + // Methods divider + nodeGroup.append('line') + .attr('x1', 0) + .attr('y1', yOffset - nodePadding) + .attr('x2', d.width || defaultNodeWidth) + .attr('y2', yOffset - nodePadding) + .attr('stroke', '#0a3dfa') + .attr('stroke-width', 1); - // Method entries - d.methods.forEach((method, i) => { - const methodText = method.returnType - ? `${method.name}(): ${method.returnType}` - : `${method.name}()`; - - nodeGroup.append('text') - .attr('class', 'node-method') - .attr('x', 10) - .attr('y', yOffset + i * methodHeight) - .attr('fill', '#172a59') - .attr('font-size', '12px') - .attr('font-family', "'Monaco', 'Courier New', monospace") - .text(methodText); + // Method entries + d.methods.forEach((method, i) => { + const methodText = method.returnType + ? `${method.name}(): ${method.returnType}` + : `${method.name}()`; + + nodeGroup.append('text') + .attr('class', 'node-method') + .attr('x', 10) + .attr('y', yOffset + i * methodHeight) + .attr('fill', '#172a59') + .attr('font-size', '12px') + .attr('font-family', "'Monaco', 'Courier New', monospace") + .text(methodText); + }); }); - }); + + // Draw slotUsage section + nodes.each(function(d) { + if (!d.slotUsage || d.slotUsage.length === 0) return; + + const nodeGroup = d3.select(this); + const attributeCount = d.attributes?.length || 0; + const methodCount = d.methods?.length || 0; + + let yOffset = nodeHeaderHeight + nodePadding + + (attributeCount > 0 ? attributeCount * attributeHeight + nodePadding : 0) + + (methodCount > 0 ? methodCount * methodHeight + nodePadding : 0); + + // Slot usage divider (green to match slot theme) + nodeGroup.append('line') + .attr('x1', 0) + .attr('y1', yOffset - nodePadding) + .attr('x2', d.width || defaultNodeWidth) + .attr('y2', yOffset - nodePadding) + .attr('stroke', '#10b981') + .attr('stroke-width', 1) + .attr('stroke-dasharray', '4,2'); // Dashed to indicate it's special + + // Slot Usage Header + // Background for header + nodeGroup.append('rect') + .attr('x', 2) + .attr('y', yOffset - nodePadding + 2) + .attr('width', (d.width || defaultNodeWidth) - 4) + .attr('height', 16) + .attr('fill', '#d1fae5') // Light emerald + .attr('rx', 2); + + nodeGroup.append('text') + .attr('x', (d.width || defaultNodeWidth) / 2) + .attr('y', yOffset - nodePadding + 14) // Center vertically in rect + .attr('text-anchor', 'middle') + .attr('fill', '#065f46') // Dark emerald + .attr('font-size', '10px') + .attr('font-weight', 'bold') + .attr('text-transform', 'uppercase') + .text('Slot Usage Overrides'); + + yOffset += 20; // Move down past header + + // Slot usage entries + d.slotUsage.forEach((item, i) => { + // Bullet point (✦) + nodeGroup.append('text') + .attr('x', 10) + .attr('y', yOffset + i * attributeHeight) + .attr('fill', '#059669') // Emerald 600 + .attr('font-size', '10px') + .text('✦'); // Sparkle/star icon + + // Item text + nodeGroup.append('text') + .attr('class', 'node-slot-usage') + .attr('x', 24) + .attr('y', yOffset + i * attributeHeight) + .attr('fill', '#064e3b') // Emerald 900 + .attr('font-size', '12px') + .attr('font-family', "'Monaco', 'Courier New', monospace") + .text(item); + }); + }); + // Shared function to update all link positions - ensures edges stay attached to box borders const updateLinkPositions = () => { diff --git a/frontend/src/lib/linkml/linkml-schema-service.ts b/frontend/src/lib/linkml/linkml-schema-service.ts index 289305655f..0fc70219f6 100644 --- a/frontend/src/lib/linkml/linkml-schema-service.ts +++ b/frontend/src/lib/linkml/linkml-schema-service.ts @@ -257,8 +257,8 @@ export interface SlotExportInfo { /** Classes that have slot_usage overrides for this slot */ classesWithSlotUsage: Array<{ className: string; - /** Properties overridden in slot_usage (e.g., 'range', 'description', 'required') */ - overrides: string[]; + /** Properties overridden in slot_usage with their values */ + overrides: Array<{ property: string; value: string }>; }>; /** The range type if it's a class or enum (for navigation) */ @@ -1568,17 +1568,33 @@ class LinkMLSchemaService { // Check if class has slot_usage for this slot if (classDef.slot_usage?.[slotName]) { const slotUsage = classDef.slot_usage[slotName]; - const overrides: string[] = []; + const overrides: Array<{ property: string; value: string }> = []; - // Detect which properties are overridden - if (slotUsage.range !== undefined) overrides.push('range'); - if (slotUsage.description !== undefined) overrides.push('description'); - if (slotUsage.required !== undefined) overrides.push('required'); - if (slotUsage.multivalued !== undefined) overrides.push('multivalued'); - if (slotUsage.pattern !== undefined) overrides.push('pattern'); - if (slotUsage.slot_uri !== undefined) overrides.push('slot_uri'); - if (slotUsage.identifier !== undefined) overrides.push('identifier'); - if (slotUsage.examples !== undefined) overrides.push('examples'); + // Detect which properties are overridden and capture values + if (slotUsage.range !== undefined) { + overrides.push({ property: 'range', value: String(slotUsage.range) }); + } + if (slotUsage.description !== undefined) { + overrides.push({ property: 'description', value: slotUsage.description }); + } + if (slotUsage.required !== undefined) { + overrides.push({ property: 'required', value: String(slotUsage.required) }); + } + if (slotUsage.multivalued !== undefined) { + overrides.push({ property: 'multivalued', value: String(slotUsage.multivalued) }); + } + if (slotUsage.pattern !== undefined) { + overrides.push({ property: 'pattern', value: slotUsage.pattern }); + } + if (slotUsage.slot_uri !== undefined) { + overrides.push({ property: 'slot_uri', value: slotUsage.slot_uri }); + } + if (slotUsage.identifier !== undefined) { + overrides.push({ property: 'identifier', value: String(slotUsage.identifier) }); + } + if (slotUsage.examples !== undefined) { + overrides.push({ property: 'examples', value: `(${slotUsage.examples.length} examples)` }); + } exportInfo.classesWithSlotUsage.push({ className, diff --git a/frontend/src/pages/EntityReviewPage.css b/frontend/src/pages/EntityReviewPage.css index 6043d4a7ea..334e702bb2 100644 --- a/frontend/src/pages/EntityReviewPage.css +++ b/frontend/src/pages/EntityReviewPage.css @@ -3059,3 +3059,25 @@ .dark .wcms-only-item:hover:not(.selected) { background: rgba(255, 255, 255, 0.03); } + +/* Profile Sources Section (Matches Email Semantics Section style) */ +.profile-sources-section { + margin-top: 1rem; + padding: 0.75rem; + background: rgba(16, 185, 129, 0.05); + border-radius: 8px; + border: 1px solid rgba(16, 185, 129, 0.15); +} + +.dark .profile-sources-section { + background: rgba(16, 185, 129, 0.1); + border-color: rgba(16, 185, 129, 0.25); +} + +/* Remove default styling from inner existing-source-urls when inside profile-sources-section */ +.profile-sources-section .existing-source-urls { + background: transparent; + border: none; + padding: 0; + margin-bottom: 0; +} diff --git a/frontend/src/pages/EntityReviewPage.tsx b/frontend/src/pages/EntityReviewPage.tsx index ac6ce3aef7..7b5df57199 100644 --- a/frontend/src/pages/EntityReviewPage.tsx +++ b/frontend/src/pages/EntityReviewPage.tsx @@ -491,11 +491,16 @@ export default function EntityReviewPage() { // Initialize search fields from profile data setSearchName(data.name || ''); setSearchInstitution(data.wcms_identifiers?.institution_name || ''); - // Auto-select first pending candidate + // Auto-select candidate: prioritize matched, then pending + const matchedCandidate = data.match_candidates?.find((c: MatchCandidate) => c.review_decision === 'match'); const pendingCandidate = data.match_candidates?.find((c: MatchCandidate) => !c.reviewed); - if (pendingCandidate) { - setSelectedCandidate(pendingCandidate); - fetchLinkedinProfile(pendingCandidate.linkedin_ppid); + + // Select matched first, then pending, otherwise none (or could select first available) + const candidateToSelect = matchedCandidate || pendingCandidate; + + if (candidateToSelect) { + setSelectedCandidate(candidateToSelect); + fetchLinkedinProfile(candidateToSelect.linkedin_ppid); } } catch (err) { setError(err instanceof Error ? err.message : 'Unknown error'); @@ -1796,6 +1801,68 @@ export default function EntityReviewPage() { )} + + {/* Existing Source URLs (Moved from bottom) */} + {selectedProfile.source_urls && selectedProfile.source_urls.length > 0 && ( +
+
+ + {language === 'nl' ? '🌐 Extra Bronnen' : '🌐 Additional Sources'} + +
+
+ {selectedProfile.source_urls.map((source: SourceUrlItem) => { + // Extract path from URL for display (full URL minus protocol) + let displayUrl = source.source_url; + try { + const urlObj = new URL(source.source_url); + // Show hostname + path (truncate if too long) + displayUrl = urlObj.hostname + urlObj.pathname; + if (displayUrl.length > 50) { + displayUrl = displayUrl.substring(0, 47) + '...'; + } + } catch { + displayUrl = source.source_domain || source.source_url; + } + return ( +
+
+ + + {displayUrl} + + {source.provides_match && ( + + + {language === 'nl' ? 'Match' : 'Match'} + + )} +
+ {source.comment && ( +
+ "{source.comment}" +
+ )} + {source.added_at && ( +
+ {new Date(source.added_at).toLocaleDateString()} +
+ )} +
+ ); + })} +
+
+ )} {/* Candidate selector */} @@ -2114,64 +2181,7 @@ export default function EntityReviewPage() { {/* Other Source URL Section */}
- {/* Display existing source URLs */} - {selectedProfile?.source_urls && selectedProfile.source_urls.length > 0 && ( -
-
- - {language === 'nl' ? 'Toegevoegde bronnen' : 'Added sources'} -
- {selectedProfile.source_urls.map((source: SourceUrlItem) => { - // Extract path from URL for display (full URL minus protocol) - let displayUrl = source.source_url; - try { - const urlObj = new URL(source.source_url); - // Show hostname + path (truncate if too long) - displayUrl = urlObj.hostname + urlObj.pathname; - if (displayUrl.length > 50) { - displayUrl = displayUrl.substring(0, 47) + '...'; - } - } catch { - displayUrl = source.source_domain || source.source_url; - } - return ( -
-
- - - {displayUrl} - - {source.provides_match && ( - - - {language === 'nl' ? 'Match' : 'Match'} - - )} -
- {source.comment && ( -
- "{source.comment}" -
- )} - {source.added_at && ( -
- {new Date(source.added_at).toLocaleDateString()} -
- )} -
- ); - })} -
- )} + {/* Existing source URLs moved to profile details */}