@ontology @uko
Feature: UKO Ontology Domain Registry and Turtle Validation
As an ACMS developer
I need a central registry for UKO domain ontologies
So that analyzers, strategies, and the graph backend can discover
namespace IRIs, class inventories, and DetailLevelMaps for each domain
Background:
Given the UKO ontology registry module is available
# ---------------------------------------------------------------------------
# Domain Lookup
# ---------------------------------------------------------------------------
@ontology @registry
Scenario: Look up Layer 0 domain by prefix
When I look up domain "uko:"
Then the domain IRI should be "https://cleveragents.ai/ontology/uko#"
And the domain layer should be 0
And the domain classes should contain "uko:InformationUnit"
And the domain classes should contain "uko:Container"
And the domain classes should contain "uko:Atom"
And the domain classes should contain "uko:Annotation"
And the domain classes should contain "uko:Boundary"
@ontology @registry
Scenario: Look up uko-code: domain by prefix
When I look up domain "uko-code:"
Then the domain IRI should be "https://cleveragents.ai/ontology/uko/code#"
And the domain layer should be 1
And the domain classes should contain "uko-code:Module"
And the domain classes should contain "uko-code:Callable"
And the domain classes should contain "uko-code:TypeDefinition"
And the domain classes should contain "uko-code:TestCase"
And the domain classes should contain "uko-code:Import"
@ontology @registry
Scenario: Look up uko-doc: domain by prefix
When I look up domain "uko-doc:"
Then the domain IRI should be "https://cleveragents.ai/ontology/uko/doc#"
And the domain layer should be 1
And the domain should have 17 classes
And the domain classes should contain "uko-doc:Document"
And the domain classes should contain "uko-doc:Section"
And the domain classes should contain "uko-doc:Paragraph"
And the domain classes should contain "uko-doc:Citation"
And the domain classes should contain "uko-doc:TableOfContents"
@ontology @registry
Scenario: Look up uko-data: domain by prefix
When I look up domain "uko-data:"
Then the domain IRI should be "https://cleveragents.ai/ontology/uko/data#"
And the domain layer should be 1
And the domain should have 13 classes
And the domain classes should contain "uko-data:Table"
And the domain classes should contain "uko-data:Column"
And the domain classes should contain "uko-data:ForeignKey"
And the domain classes should contain "uko-data:StoredProcedure"
And the domain classes should contain "uko-data:View"
@ontology @registry
Scenario: Look up uko-infra: domain by prefix
When I look up domain "uko-infra:"
Then the domain IRI should be "https://cleveragents.ai/ontology/uko/infra#"
And the domain layer should be 1
And the domain should have 7 classes
And the domain classes should contain "uko-infra:Service"
And the domain classes should contain "uko-infra:Endpoint"
And the domain classes should contain "uko-infra:Port"
And the domain classes should contain "uko-infra:ConfigBlock"
And the domain classes should contain "uko-infra:ConfigKey"
@ontology @registry @negative
Scenario: Look up unknown domain raises ValueError
When I look up domain "uko-xyz:"
Then a ValueError should have been raised with message "Unknown UKO domain prefix"
@ontology @registry @negative
Scenario: Look up empty domain prefix raises ValueError
When I look up an empty domain prefix
Then a ValueError should have been raised with message "must not be empty"
# ---------------------------------------------------------------------------
# List Domains
# ---------------------------------------------------------------------------
@ontology @registry
Scenario: list_domains returns all 5 registered domains
When I list all domains
Then the domain list should have 5 entries
And the domain list should be sorted by layer then prefix
@ontology @registry
Scenario: get_layer1_domains returns exactly 4 domains
When I get Layer 1 domains
Then the Layer 1 list should have 4 entries
And every domain in the Layer 1 list should have layer 1
# ---------------------------------------------------------------------------
# DetailLevelMap — spec-complete resolution for uko-code:
# ---------------------------------------------------------------------------
@ontology @detail_levels
Scenario: uko-code: map resolves all 10 named levels
When I look up domain "uko-code:"
Then the detail map should resolve "MODULE_LISTING" to 0
And the detail map should resolve "MODULE_GRAPH" to 1
And the detail map should resolve "MEMBER_LISTING" to 2
And the detail map should resolve "MEMBER_SUMMARY" to 3
And the detail map should resolve "SIGNATURES" to 4
And the detail map should resolve "SIGNATURES_WITH_DOCS" to 5
And the detail map should resolve "STRUCTURAL_OUTLINE" to 6
And the detail map should resolve "KEY_LOGIC" to 7
And the detail map should resolve "NEAR_COMPLETE" to 8
And the detail map should resolve "FULL_SOURCE" to 9
# ---------------------------------------------------------------------------
# DetailLevelMap — spec-complete resolution for uko-doc:
# ---------------------------------------------------------------------------
@ontology @detail_levels
Scenario: uko-doc: map resolves all 11 named levels
When I look up domain "uko-doc:"
Then the detail map should resolve "TITLE_ONLY" to 0
And the detail map should resolve "TABLE_OF_CONTENTS_L1" to 1
And the detail map should resolve "TABLE_OF_CONTENTS_L2" to 2
And the detail map should resolve "FULL_TOC" to 3
And the detail map should resolve "TOC_WITH_SUMMARIES" to 4
And the detail map should resolve "SECTION_OVERVIEWS" to 5
And the detail map should resolve "TOPIC_SENTENCES" to 6
And the detail map should resolve "PARAGRAPH_SUMMARIES" to 7
And the detail map should resolve "STRUCTURAL_DETAIL" to 8
And the detail map should resolve "NEAR_COMPLETE" to 9
And the detail map should resolve "FULL_CONTENT" to 10
# ---------------------------------------------------------------------------
# DetailLevelMap — spec-complete resolution for uko-data:
# ---------------------------------------------------------------------------
@ontology @detail_levels
Scenario: uko-data: map resolves all 12 named levels
When I look up domain "uko-data:"
Then the detail map should resolve "SCHEMA_LISTING" to 0
And the detail map should resolve "TABLE_LISTING" to 1
And the detail map should resolve "COLUMN_LISTING" to 2
And the detail map should resolve "TYPED_COLUMNS" to 3
And the detail map should resolve "CONSTRAINTS" to 4
And the detail map should resolve "RELATIONSHIPS" to 5
And the detail map should resolve "INDEXES_AND_STATS" to 6
And the detail map should resolve "DDL" to 7
And the detail map should resolve "DDL_WITH_TRIGGERS" to 8
And the detail map should resolve "FULL_PROCEDURES" to 9
And the detail map should resolve "WITH_SAMPLE_DATA" to 10
And the detail map should resolve "FULL_CATALOG" to 11
# ---------------------------------------------------------------------------
# DetailLevelMap — spec-complete resolution for uko-infra:
# ---------------------------------------------------------------------------
@ontology @detail_levels
Scenario: uko-infra: map resolves all 9 named levels
When I look up domain "uko-infra:"
Then the detail map should resolve "SERVICE_LISTING" to 0
And the detail map should resolve "SERVICE_GRAPH" to 1
And the detail map should resolve "ENDPOINT_LISTING" to 2
And the detail map should resolve "ENDPOINT_DETAIL" to 3
And the detail map should resolve "CONFIG_KEYS" to 4
And the detail map should resolve "CONFIG_VALUES" to 5
And the detail map should resolve "RESOURCE_LIMITS" to 6
And the detail map should resolve "FULL_CONFIG" to 7
And the detail map should resolve "WITH_DEPLOYMENT" to 8
# ---------------------------------------------------------------------------
# DetailLevelMap — integer depth resolution
# ---------------------------------------------------------------------------
@ontology @detail_levels
Scenario: Integer depth is clamped to max_depth
When I look up domain "uko-code:"
Then the detail map should clamp depth 15 to 9
And the detail map should clamp depth 0 to 0
And the detail map should clamp depth 5 to 5
@ontology @detail_levels @negative
Scenario: Unknown named level raises ValueError
When I look up domain "uko-code:"
And I try to resolve level "NONEXISTENT_LEVEL"
Then a ValueError should have been raised with message "Unknown detail level"
# ---------------------------------------------------------------------------
# DetailLevelMap — inheritance chain (Layer 3 → 2 → 1 → 0)
# ---------------------------------------------------------------------------
@ontology @detail_levels @inheritance
Scenario: build_detail_map_chain wires parent linkage
When I build a detail map chain from "uko-code:"
Then the chain should resolve "MODULE_LISTING" to 0
And the chain should resolve "FULL_SOURCE" to 9
And the chain max depth should be 9
@ontology @detail_levels @inheritance
Scenario: Two-level chain inherits parent levels
Given a custom DetailLevelMap for domain "uko-oo:" with parent "uko-code:" and levels:
| level | depth |
| CLASS_HIERARCHY | 3 |
When I resolve "MODULE_LISTING" on the custom map
Then the resolved depth should be 0
When I resolve "CLASS_HIERARCHY" on the custom map
Then the resolved depth should be 3
@ontology @detail_levels @inheritance @negative
Scenario: build_detail_map_chain with no prefixes raises ValueError
When I build a detail map chain with no prefixes
Then a ValueError should have been raised with message "At least one domain prefix"
# ---------------------------------------------------------------------------
# Turtle Validation — well-formed file
# ---------------------------------------------------------------------------
@ontology @turtle
Scenario: The project uko.ttl file passes Turtle validation
When I validate the project Turtle file "docs/ontology/uko.ttl"
Then the validation should produce 0 errors
@ontology @turtle
Scenario: Valid minimal Turtle content passes validation
When I validate Turtle content:
"""
@prefix ex: .
ex:Thing a ex:Class .
"""
Then the validation should produce 0 errors
# ---------------------------------------------------------------------------
# Turtle Validation — error detection
# ---------------------------------------------------------------------------
@ontology @turtle @negative
Scenario: Undeclared prefix is caught
When I validate Turtle content:
"""
@prefix ex: .
bogus:Thing a ex:Class .
"""
Then the validation should produce at least 1 error
And the first error should contain "undeclared prefix"
@ontology @turtle @negative
Scenario: Unbalanced angle brackets are caught
When I validate Turtle content:
"""
@prefix ex: .
ex:Thing a