diff --git a/.opencode/rules/broaden-generic-predicate-ranges-rule.md b/.opencode/rules/broaden-generic-predicate-ranges-rule.md index 663efcaa94..6afd1b01cf 100644 --- a/.opencode/rules/broaden-generic-predicate-ranges-rule.md +++ b/.opencode/rules/broaden-generic-predicate-ranges-rule.md @@ -174,6 +174,6 @@ This approach: ## See Also - Rule 38: Slot Centralization and Semantic URI Requirements -- Rule 39: Slot Naming Convention (RiC-O Style) +- Rule: Slot Naming Convention (Current Style) - Rule 49: Slot Usage Minimization - LinkML Documentation: [slot_usage](https://linkml.io/linkml-model/latest/docs/slot_usage/) diff --git a/.opencode/rules/class-files-no-inline-slots.md b/.opencode/rules/class-files-no-inline-slots.md index 880ed6526e..85258346b5 100644 --- a/.opencode/rules/class-files-no-inline-slots.md +++ b/.opencode/rules/class-files-no-inline-slots.md @@ -135,6 +135,6 @@ The following class files have been identified as defining their own slots and r ## See Also - Rule 38: Slot Centralization and Semantic URI Requirements -- Rule 39: Slot Naming Convention (RiC-O Style) +- Rule: Slot Naming Convention (Current Style) - Rule 42: No Ontology Prefixes in Slot Names - Rule 43: Slot Nouns Must Be Singular diff --git a/.opencode/rules/full-slot-migration-rule.md b/.opencode/rules/full-slot-migration-rule.md index a7459fa3b8..6764f100d6 100644 --- a/.opencode/rules/full-slot-migration-rule.md +++ b/.opencode/rules/full-slot-migration-rule.md @@ -368,6 +368,6 @@ Before marking a slot as processed: - Rule 9: Enum-to-Class Promotion (single source of truth principle) - Rule 0b: Type/Types File Naming Convention -- Rule 39: Slot Naming Convention (RiC-O Style) +- Rule: Slot Naming Convention (Current Style) - `.opencode/ENUM_TO_CLASS_PRINCIPLE.md` - `schemas/20251121/linkml/modules/slots/slot_fixes.yaml` - **AUTHORITATIVE** master list of migrations diff --git a/.opencode/rules/generic-slots-specific-classes.md b/.opencode/rules/generic-slots-specific-classes.md index 34958ca8b8..39b6f5a5b5 100644 --- a/.opencode/rules/generic-slots-specific-classes.md +++ b/.opencode/rules/generic-slots-specific-classes.md @@ -126,4 +126,4 @@ If you encounter an overly specific slot: ## See Also * Rule 55: Broaden Generic Predicate Ranges -* Rule 39: Slot Naming Convention (RiC-O Style) +* Rule: Slot Naming Convention (Current Style) diff --git a/.opencode/rules/linkml/broaden-generic-predicate-ranges-rule.md b/.opencode/rules/linkml/broaden-generic-predicate-ranges-rule.md index 663efcaa94..6afd1b01cf 100644 --- a/.opencode/rules/linkml/broaden-generic-predicate-ranges-rule.md +++ b/.opencode/rules/linkml/broaden-generic-predicate-ranges-rule.md @@ -174,6 +174,6 @@ This approach: ## See Also - Rule 38: Slot Centralization and Semantic URI Requirements -- Rule 39: Slot Naming Convention (RiC-O Style) +- Rule: Slot Naming Convention (Current Style) - Rule 49: Slot Usage Minimization - LinkML Documentation: [slot_usage](https://linkml.io/linkml-model/latest/docs/slot_usage/) diff --git a/.opencode/rules/linkml/class-files-no-inline-slots.md b/.opencode/rules/linkml/class-files-no-inline-slots.md index 994dd0bd0f..557b02094f 100644 --- a/.opencode/rules/linkml/class-files-no-inline-slots.md +++ b/.opencode/rules/linkml/class-files-no-inline-slots.md @@ -128,6 +128,6 @@ Files that match need refactoring: ## See Also - Rule 38: Slot Centralization and Semantic URI Requirements -- Rule 39: Slot Naming Convention (RiC-O Style) +- Rule: Slot Naming Convention (Current Style) - Rule 42: No Ontology Prefixes in Slot Names - Rule 43: Slot Nouns Must Be Singular diff --git a/.opencode/rules/slot-naming-convention-current-style.md b/.opencode/rules/slot-naming-convention-current-style.md new file mode 100644 index 0000000000..0646e21dd9 --- /dev/null +++ b/.opencode/rules/slot-naming-convention-current-style.md @@ -0,0 +1,75 @@ +# Rule: Slot Naming Convention (Current Style) + +🚨 **CRITICAL**: New LinkML slot names MUST follow the current verb-first naming style used in active slot files under `schemas/20251121/linkml/modules/slots/`. + +## Status + +- This rule **replaces** the deprecated RiC-O naming rule. +- The old `has_or_had_*` / `is_or_was_*` requirement is not mandatory for new slot names. + +## Core Naming Rules + +1. Use `snake_case`. +2. Prefer short, descriptive verb predicates as canonical names. +3. Keep names ontology-neutral (no ontology namespace prefixes in slot names). +4. Use singular nouns in object positions (including multivalued slots). +5. Keep temporal semantics in mappings/definitions when needed, not by forcing a legacy prefix. + +## Preferred Patterns + +### 1) Simple verb predicates (default) + +Use a single verb when it clearly expresses the relation. + +Examples from active slots: +- `accept` +- `contain` +- `catalogue` +- `exhibit` + +### 2) Verb + particle/preposition when needed + +Use compact phrasal forms when a preposition carries core meaning. + +Examples: +- `belong_to` +- `located_in` +- `derived_from` + +### 3) Symmetric or directional pair pattern + +Use `_or_` when both directions/states are intentionally modeled in one predicate label. + +Examples: +- `contains_or_contained` +- `includes_or_included` +- `operates_or_operated` + +## Legacy Compatibility + +- Existing `has_or_had_*` and `is_or_was_*` slots can remain where already established. +- For migrations, keep backward compatibility via `aliases` when renaming to current-style canonical names. +- Do not rename canonical slots opportunistically; follow migration plans and canonical-slot protection rules. + +## Anti-Patterns + +- ❌ `rico_has_or_had_holder` (ontology prefix in name) +- ❌ `collections` (plural noun predicate) +- ❌ `has_museum_visitor_count` (class-specific slot name) +- ❌ Creating new `has_or_had_*` names by default when a verb predicate is clearer + +## Quick Checklist + +- [ ] Is the canonical slot name verb-first and descriptive? +- [ ] Is it `snake_case`? +- [ ] Is the noun part singular? +- [ ] Is the name ontology-neutral? +- [ ] If renaming legacy slots, are aliases/migration constraints handled? + +## See Also + +- `.opencode/rules/archive/DEPRECATED-slot-naming-convention-rico-style.md` +- `.opencode/rules/no-ontology-prefix-in-slot-names.md` +- `.opencode/rules/slot-noun-singular-convention.md` +- `.opencode/rules/generic-slots-specific-classes.md` +- `.opencode/rules/canonical-slot-protection-rule.md` diff --git a/.opencode/rules/slot-noun-singular-convention.md b/.opencode/rules/slot-noun-singular-convention.md index 5ac18f385a..c9d3a17b65 100644 --- a/.opencode/rules/slot-noun-singular-convention.md +++ b/.opencode/rules/slot-noun-singular-convention.md @@ -76,5 +76,5 @@ When creating or renaming slots: ## See Also -- `.opencode/rules/slot-naming-convention-rico-style.md` - RiC-O naming patterns +- `.opencode/rules/slot-naming-convention-current-style.md` - Current slot naming patterns - `.opencode/rules/slot-centralization-and-semantic-uri-rule.md` - Slot centralization requirements diff --git a/frontend/public/schemas/20251121/linkml/manifest.json b/frontend/public/schemas/20251121/linkml/manifest.json index 5f4232b3b4..e0387c77aa 100644 --- a/frontend/public/schemas/20251121/linkml/manifest.json +++ b/frontend/public/schemas/20251121/linkml/manifest.json @@ -1,5 +1,5 @@ { - "generated": "2026-02-15T14:54:26.856Z", + "generated": "2026-02-15T14:58:54.703Z", "schemaRoot": "/schemas/20251121/linkml", "totalFiles": 2369, "categoryCounts": { diff --git a/schemas/20251121/linkml/manifest.json b/schemas/20251121/linkml/manifest.json index e0387c77aa..f8c5694dc6 100644 --- a/schemas/20251121/linkml/manifest.json +++ b/schemas/20251121/linkml/manifest.json @@ -1,5 +1,5 @@ { - "generated": "2026-02-15T14:58:54.703Z", + "generated": "2026-02-15T15:02:31.403Z", "schemaRoot": "/schemas/20251121/linkml", "totalFiles": 2369, "categoryCounts": { diff --git a/schemas/20251121/linkml/modules/slots/archive/has_or_had_data_quality_notes.yaml b/schemas/20251121/linkml/modules/slots/archive/has_or_had_data_quality_notes.yaml index 8b2b41b182..f03c2e21af 100644 --- a/schemas/20251121/linkml/modules/slots/archive/has_or_had_data_quality_notes.yaml +++ b/schemas/20251121/linkml/modules/slots/archive/has_or_had_data_quality_notes.yaml @@ -13,7 +13,7 @@ slots: slot_uri: dqv:hasQualityAnnotation description: "Notes regarding data quality." range: string # uriorcurie - # range: DigitalPlatformV2DataQualityNotes + # range: DigitalPlatformDataQualityNotes multivalued: true annotations: custodian_types: '["*"]' diff --git a/schemas/20251121/linkml/modules/slots/archive/has_or_had_key_contact.yaml b/schemas/20251121/linkml/modules/slots/archive/has_or_had_key_contact.yaml index 15a92b4e4a..1cba7521ed 100644 --- a/schemas/20251121/linkml/modules/slots/archive/has_or_had_key_contact.yaml +++ b/schemas/20251121/linkml/modules/slots/archive/has_or_had_key_contact.yaml @@ -13,7 +13,7 @@ slots: slot_uri: schema:employee description: "Key contact person for the organization." range: string # uriorcurie - # range: DigitalPlatformV2KeyContact + # range: DigitalPlatformKeyContact multivalued: true annotations: custodian_types: '["*"]' diff --git a/schemas/20251121/linkml/modules/slots/archive/has_or_had_organization_profile.yaml b/schemas/20251121/linkml/modules/slots/archive/has_or_had_organization_profile.yaml index 1a910b5ad3..d421c0388c 100644 --- a/schemas/20251121/linkml/modules/slots/archive/has_or_had_organization_profile.yaml +++ b/schemas/20251121/linkml/modules/slots/archive/has_or_had_organization_profile.yaml @@ -13,7 +13,7 @@ slots: slot_uri: org:linkedTo description: "Detailed profile of the organization." range: string # uriorcurie - # range: DigitalPlatformV2OrganizationProfile + # range: DigitalPlatformOrganizationProfile multivalued: true related_mappings: - org:linkedTo diff --git a/schemas/20251121/linkml/modules/slots/archive/has_or_had_organization_status.yaml b/schemas/20251121/linkml/modules/slots/archive/has_or_had_organization_status.yaml index 4d7ccbfaab..7fa45b6545 100644 --- a/schemas/20251121/linkml/modules/slots/archive/has_or_had_organization_status.yaml +++ b/schemas/20251121/linkml/modules/slots/archive/has_or_had_organization_status.yaml @@ -13,7 +13,7 @@ slots: slot_uri: org:classification description: "Status of the organization (e.g., active, dissolved)." range: string # uriorcurie - # range: DigitalPlatformV2OrganizationStatus + # range: DigitalPlatformOrganizationStatus multivalued: true annotations: custodian_types: '["*"]' diff --git a/schemas/20251121/linkml/modules/slots/archive/has_or_had_primary_platform.yaml b/schemas/20251121/linkml/modules/slots/archive/has_or_had_primary_platform.yaml index 1121fc3136..6f3b9c53b8 100644 --- a/schemas/20251121/linkml/modules/slots/archive/has_or_had_primary_platform.yaml +++ b/schemas/20251121/linkml/modules/slots/archive/has_or_had_primary_platform.yaml @@ -13,7 +13,7 @@ slots: slot_uri: schema:mainEntity description: "Primary digital platform of the organization." range: string # uriorcurie - # range: DigitalPlatformV2PrimaryPlatform + # range: DigitalPlatformPrimaryPlatform multivalued: false annotations: custodian_types: '["*"]' diff --git a/schemas/20251121/linkml/modules/slots/archive/has_or_had_service_details.yaml b/schemas/20251121/linkml/modules/slots/archive/has_or_had_service_details.yaml index e02484926e..451599d15f 100644 --- a/schemas/20251121/linkml/modules/slots/archive/has_or_had_service_details.yaml +++ b/schemas/20251121/linkml/modules/slots/archive/has_or_had_service_details.yaml @@ -13,7 +13,7 @@ slots: slot_uri: schema:serviceOutput description: "Details about services provided." range: string # uriorcurie - # range: DigitalPlatformV2ServiceDetails + # range: DigitalPlatformServiceDetails multivalued: true annotations: custodian_types: '["*"]' diff --git a/schemas/20251121/linkml/modules/slots/archive/has_or_had_transformation_metadata.yaml b/schemas/20251121/linkml/modules/slots/archive/has_or_had_transformation_metadata.yaml index 92ea9b7642..da6cc6d13d 100644 --- a/schemas/20251121/linkml/modules/slots/archive/has_or_had_transformation_metadata.yaml +++ b/schemas/20251121/linkml/modules/slots/archive/has_or_had_transformation_metadata.yaml @@ -13,7 +13,7 @@ slots: slot_uri: prov:wasGeneratedBy description: "Metadata regarding data transformation processes." range: string # uriorcurie - # range: DigitalPlatformV2TransformationMetadata + # range: DigitalPlatformTransformationMetadata multivalued: true annotations: custodian_types: '["*"]'