PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX linkml: <https://w3id.org/linkml/>
PREFIX cf: <https://cataforge.dev/ontology/>
PREFIX cfgov: <https://cataforge.dev/governance/>
PREFIX cfprj: <https://cataforge.dev/instance/>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX prov: <http://www.w3.org/ns/prov#>
PREFIX sh: <http://www.w3.org/ns/shacl#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX vann: <http://purl.org/vocab/vann/>

cf:core a owl:Ontology ;
  rdfs:label "CataForge Core Business-Document Ontology" ;
  rdfs:comment "LinkML schema for the business-document domain entities produced by the 6 SDLC role agents (product-manager, architect, ui-designer, tech-lead, qa-engineer, devops). Models intra-layer composition and the cross-SDLC traceability matrix that is the central value of the 0.5.0 KG migration. Single source of truth — generates Pydantic v2 models + OWL/SHACL." ;
  dcterms:license "Apache-2.0" ;
  vann:preferredNamespacePrefix "cf" ;
  vann:preferredNamespaceUri "https://cataforge.dev/ontology/"^^xsd:anyURI ;
  sh:declare [
    sh:prefix "linkml" ;
    sh:namespace "https://w3id.org/linkml/"^^xsd:anyURI
  ] , [
    sh:prefix "cf" ;
    sh:namespace "https://cataforge.dev/ontology/"^^xsd:anyURI
  ] , [
    sh:prefix "cfgov" ;
    sh:namespace "https://cataforge.dev/governance/"^^xsd:anyURI
  ] , [
    sh:prefix "cfprj" ;
    sh:namespace "https://cataforge.dev/instance/"^^xsd:anyURI
  ] , [
    sh:prefix "rdf" ;
    sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI
  ] , [
    sh:prefix "rdfs" ;
    sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI
  ] , [
    sh:prefix "owl" ;
    sh:namespace "http://www.w3.org/2002/07/owl#"^^xsd:anyURI
  ] , [
    sh:prefix "xsd" ;
    sh:namespace "http://www.w3.org/2001/XMLSchema#"^^xsd:anyURI
  ] , [
    sh:prefix "dcterms" ;
    sh:namespace "http://purl.org/dc/terms/"^^xsd:anyURI
  ] , [
    sh:prefix "prov" ;
    sh:namespace "http://www.w3.org/ns/prov#"^^xsd:anyURI
  ] , [
    sh:prefix "sh" ;
    sh:namespace "http://www.w3.org/ns/shacl#"^^xsd:anyURI
  ] .

cf:SoftwareArtifact a owl:Class ;
  rdfs:comment "Common ancestor of every business-domain entity. All concrete subclasses carry a deterministic sort_key, a content_hash, and source_doc/section back-pointers for KG ⇄ Markdown idempotent round-trip." ;
  rdfs:subClassOf [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:sort_key ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:sort_key ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:title ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:title ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:description ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:description ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:status ;
    owl:allValuesFrom cf:ArtifactStatusEnum
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:status ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:priority ;
    owl:allValuesFrom cf:PriorityEnum
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:priority ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:created_at ;
    owl:allValuesFrom xsd:dateTime
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:created_at ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:updated_at ;
    owl:allValuesFrom xsd:dateTime
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:updated_at ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:content_hash ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:content_hash ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:source_doc ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:source_doc ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:source_section ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:source_section ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:narrative_body ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:narrative_body ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:tags ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:authored_by ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:authored_by ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:belongs_to_project ;
    owl:allValuesFrom cf:Project
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:belongs_to_project ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:depends_on ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:dependency_of ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:part_of ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:part_of ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:has_part ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty dcterms:replaces ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty dcterms:replaces ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty dcterms:isReplacedBy ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty dcterms:isReplacedBy ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty prov:wasRevisionOf ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty prov:wasRevisionOf ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:reviewed_by ;
    owl:allValuesFrom cf:ReviewReport
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:located_in_section ;
    owl:allValuesFrom cf:Section
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:located_in_section ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Class ;
    owl:unionOf ( cf:WorkUnit cf:Milestone cf:Requirement cf:AcceptanceCriteria cf:Module cf:Component cf:Interface cf:DataModel cf:ArchitectureDecision cf:TechStack cf:Screen cf:Wireframe cf:UIComponent cf:UserFlow cf:Task cf:TestCase cf:TestSuite cf:TestPlan cf:CoverageRule cf:TestRun cf:Deployment cf:Pipeline cf:Release cf:Environment cf:Glossary cf:Risk cf:ChangeRequest cf:ReviewReport cf:DomainEntity cf:DomainAttribute )
  ] .

cf:Project a owl:Class ;
  rdfs:comment "Root container for a single user-software project." ;
  rdfs:subClassOf [
    a owl:Restriction ;
    owl:onProperty cf:title ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:title ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:description ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:description ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:process_model ;
    owl:allValuesFrom cf:ProcessModelEnum
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:process_model ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:created_at ;
    owl:allValuesFrom xsd:dateTime
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:created_at ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:updated_at ;
    owl:allValuesFrom xsd:dateTime
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:updated_at ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:WorkUnit a owl:Class ;
  rdfs:comment "Abstract unit of time/scope to which work is assigned." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:start_date ;
    owl:allValuesFrom xsd:date
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:start_date ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:end_date ;
    owl:allValuesFrom xsd:date
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:end_date ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Class ;
    owl:unionOf ( cf:Phase cf:Sprint cf:Iteration )
  ] .

cf:Phase a owl:Class ;
  rdfs:comment "Waterfall phase. Honors the existing P-NNN frontmatter prefix." ;
  rdfs:subClassOf cf:WorkUnit , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Sprint a owl:Class ;
  rdfs:comment "Agile sprint (fixed timebox)." ;
  rdfs:subClassOf cf:WorkUnit , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Iteration a owl:Class ;
  rdfs:comment "Lightweight agile iteration (variable timebox)." ;
  rdfs:subClassOf cf:WorkUnit , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Milestone a owl:Class ;
  rdfs:comment "A point-in-time marker, not a timebox." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Requirement a owl:Class ;
  rdfs:comment "Common ancestor of all requirement-layer artifacts." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:refines ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:refines ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:refined_by ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:implemented_by ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Class ;
    owl:unionOf ( cf:Feature cf:UserStory cf:Epic )
  ] .

cf:Feature a owl:Class ;
  rdfs:comment "Concrete product capability. Source: prd §2 F-NNN." ;
  rdfs:subClassOf cf:Requirement , [
    a owl:Restriction ;
    owl:onProperty cf:assigned_to_sprint ;
    owl:allValuesFrom cf:Sprint
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:assigned_to_sprint ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:belongs_to_phase ;
    owl:allValuesFrom cf:Phase
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:belongs_to_phase ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:belongs_to_work_unit ;
    owl:allValuesFrom cf:WorkUnit
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:belongs_to_work_unit ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:UserStory a owl:Class ;
  rdfs:comment "Agile narrative. May refine a Feature." ;
  rdfs:subClassOf cf:Requirement , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Epic a owl:Class ;
  rdfs:comment "Large requirement aggregating multiple Features. Maps E-NNN (see §3.9 decision)." ;
  rdfs:subClassOf cf:Requirement , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:AcceptanceCriteria a owl:Class ;
  rdfs:comment "Verifiable condition attached to a Requirement or Task. Source: prd §2.F.AC-NNN / dev-plan T-NNN.tdd_acceptance." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:acceptance_text ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:acceptance_text ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:satisfies ;
    owl:allValuesFrom cf:Requirement
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Module a owl:Class ;
  rdfs:comment "Architectural module. Source: arch §2 M-NNN." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:satisfies ;
    owl:allValuesFrom cf:Requirement
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:realized_as ;
    owl:allValuesFrom cf:Task
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:implements ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Component a owl:Class ;
  rdfs:comment "Architectural sub-component. Binds C-NNN entities sourced from arch docs. ui-spec C-NNN must be remapped to UIComponent UC-NNN via the migration codemod (see task-6 §6.5 #6, task-7 §7.2). UI-route / layout slots remain here as legacy disambiguation but are deprecated for new Component instances; UI fields belong on UIComponent." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:satisfies ;
    owl:allValuesFrom cf:Requirement
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:realized_as ;
    owl:allValuesFrom cf:Task
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:implements ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:part_of ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:part_of ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:ui_route ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:ui_route ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:layout_spec ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:layout_spec ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Interface a owl:Class ;
  rdfs:comment "Abstract interface contract between modules; non-HTTP siblings of API." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:API a owl:Class ;
  rdfs:comment "HTTP / RPC contract. Source arch §3 API-NNN." ;
  rdfs:subClassOf cf:Interface , [
    a owl:Restriction ;
    owl:onProperty cf:endpoint_path ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:endpoint_path ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:http_method ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:http_method ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:request_schema ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:request_schema ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:response_schema ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:response_schema ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:satisfies ;
    owl:allValuesFrom cf:Requirement
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:DataModel a owl:Class ;
  rdfs:comment "Persistent data entity. Source arch §4 E-NNN." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:field_definitions ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:ArchitectureDecision a owl:Class ;
  rdfs:comment "ADR-style decision record. Frontmatter prefix ADR-NNN." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:rationale ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:rationale ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:decision_outcome ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:decision_outcome ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:alternatives ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:affects ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:TechStack a owl:Class ;
  rdfs:comment "Technology-stack declaration anchored to a free-prose section (e.g., arch §1.4). Honors the section heading slug as entity_id when no ID prefix is present; otherwise TS-NNN. Carries narrative content plus structured stack_layers for queryable retrieval. Replaces the source_section() escape hatch for tech-stack content in 0.5.0." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:stack_layers ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:affects ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Screen a owl:Class ;
  rdfs:comment "Concrete rendered screen, alias of Page." ;
  rdfs:subClassOf cf:SoftwareArtifact .

cf:Page a owl:Class ;
  rdfs:comment "UI page; honors P-NNN where the source doc is ui-spec." ;
  rdfs:subClassOf cf:Screen , [
    a owl:Restriction ;
    owl:onProperty cf:satisfies ;
    owl:allValuesFrom cf:Requirement
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:ui_route ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:ui_route ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:layout_spec ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:layout_spec ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Wireframe a owl:Class ;
  rdfs:comment "Sketch / mock-up; refines a Page." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:UIComponent a owl:Class ;
  rdfs:comment "Reusable UI widget. Distinct from the architecture Component class." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:UserFlow a owl:Class ;
  rdfs:comment "Sequence of Pages forming a user journey." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Task a owl:Class ;
  rdfs:comment "Engineering task card. Source dev-plan §3 T-NNN." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:task_status ;
    owl:allValuesFrom cf:TaskStatusEnum
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:task_status ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:realizes ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:assigned_to_sprint ;
    owl:allValuesFrom cf:Sprint
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:assigned_to_sprint ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:belongs_to_phase ;
    owl:allValuesFrom cf:Phase
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:belongs_to_phase ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:belongs_to_work_unit ;
    owl:allValuesFrom cf:WorkUnit
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:belongs_to_work_unit ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Subtask a owl:Class ;
  rdfs:comment "Decomposed child of a Task." ;
  rdfs:subClassOf cf:Task , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:TestCase a owl:Class ;
  rdfs:comment "Single verifiable test scenario. Source test-report §2 TC-NNN." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:verifies ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:test_steps ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:expected_result ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:expected_result ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:test_result ;
    owl:allValuesFrom cf:TestResultEnum
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:test_result ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:TestSuite a owl:Class ;
  rdfs:comment "Grouping of TestCases." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:has_part ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:TestPlan a owl:Class ;
  rdfs:comment "Overall test strategy document." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:CoverageRule a owl:Class ;
  rdfs:comment "Declarative coverage requirement (e.g. every Feature must have ≥1 TestCase)." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:TestRun a owl:Class ;
  rdfs:comment "A single execution of a TestSuite/TestCase, producing TestResult facts." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:test_result ;
    owl:allValuesFrom cf:TestResultEnum
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:test_result ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:verifies ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Deployment a owl:Class ;
  rdfs:comment "An act of deploying a Release into an Environment." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:environment ;
    owl:allValuesFrom cf:EnvironmentEnum
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:environment ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:delivers ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Pipeline a owl:Class ;
  rdfs:comment "CI/CD pipeline definition." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:pipeline_steps ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Release a owl:Class ;
  rdfs:comment "Versioned bundle of delivered Features." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:version ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:version ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:release_notes ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:release_notes ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:delivers ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Environment a owl:Class ;
  rdfs:comment "Deployment target environment (dev/staging/production)." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Glossary a owl:Class ;
  rdfs:comment "Domain term definition." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:glossary_term ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:glossary_term ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:glossary_definition ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:glossary_definition ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Risk a owl:Class ;
  rdfs:comment "Identified risk plus its mitigation." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:risk_level ;
    owl:allValuesFrom cf:RiskLevelEnum
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:risk_level ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:mitigation ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:mitigation ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:affects ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:ChangeRequest a owl:Class ;
  rdfs:comment "Proposed change with impact set." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:change_status ;
    owl:allValuesFrom cf:ChangeStatusEnum
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:change_status ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:rationale ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:rationale ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:affects ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:ReviewReport a owl:Class ;
  rdfs:comment "Output of a review skill (doc-review / sprint-review / code-review)." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:targets_artifact ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:targets_artifact ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:rationale ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:rationale ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:SprintReviewIssue a owl:Class ;
  rdfs:comment "Issue raised during sprint review. Honors existing SR-NNN prefix." ;
  rdfs:subClassOf cf:ReviewReport , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:DomainEntity a owl:Class ;
  rdfs:comment "Bounded downstream extension point; carries a registered domain_type." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:domain_type ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:domain_type ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:has_attribute ;
    owl:allValuesFrom cf:DomainAttribute
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:satisfies ;
    owl:allValuesFrom cf:Requirement
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:entity_id ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:DomainAttribute a owl:Class ;
  rdfs:comment "Structured key/value attribute attached to a DomainEntity." ;
  rdfs:subClassOf cf:SoftwareArtifact , [
    a owl:Restriction ;
    owl:onProperty cf:attr_name ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:attr_name ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:attr_value ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:attr_value ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:attribute_of ;
    owl:allValuesFrom cf:DomainEntity
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:attribute_of ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] .

cf:Document a owl:Class ;
  rdfs:comment "A whole business document; container for its sections and entities." ;
  rdfs:subClassOf [
    a owl:Restriction ;
    owl:onProperty cf:title ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:title ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:doc_type ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:doc_type ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:version ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:version ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:status ;
    owl:allValuesFrom cf:ArtifactStatusEnum
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:status ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:source_doc ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:source_doc ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:source_path ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:source_path ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:frontmatter_raw ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:frontmatter_raw ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:preamble_body ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:preamble_body ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:content_hash ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:content_hash ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:authored_by ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:authored_by ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:created_at ;
    owl:allValuesFrom xsd:dateTime
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:created_at ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:updated_at ;
    owl:allValuesFrom xsd:dateTime
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:updated_at ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:has_section ;
    owl:allValuesFrom cf:Section
  ] .

cf:Section a owl:Class ;
  rdfs:comment "Heading-delimited section of a Document. Carries narrative prose (narrative_body) and the structured entities sourced from it (contains_entity), making whole-document content — structured and prose — first-class graph content." ;
  rdfs:subClassOf [
    a owl:Restriction ;
    owl:onProperty cf:title ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:title ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:section_anchor ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:section_anchor ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:narrative_body ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:narrative_body ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:sort_key ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:sort_key ;
    owl:cardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:position ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:position ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:section_level ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:section_level ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:content_hash ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:content_hash ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:source_doc ;
    owl:allValuesFrom xsd:string
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:source_doc ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:part_of_document ;
    owl:allValuesFrom cf:Document
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:part_of_document ;
    owl:maxCardinality "1"^^xsd:nonNegativeInteger
  ] , [
    a owl:Restriction ;
    owl:onProperty cf:contains_entity ;
    owl:allValuesFrom cf:SoftwareArtifact
  ] .

cf:entity_id a owl:DatatypeProperty ;
  rdfs:comment "Frontmatter ID such as F-001, M-014, T-007." ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:sort_key a owl:DatatypeProperty ;
  rdfs:comment "Deterministic export sort key." ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:title a owl:DatatypeProperty ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:description a owl:DatatypeProperty ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:status a owl:ObjectProperty ;
  rdfs:range cf:ArtifactStatusEnum ;
  a owl:FunctionalProperty .

cf:priority a owl:ObjectProperty ;
  rdfs:range cf:PriorityEnum ;
  a owl:FunctionalProperty .

cf:created_at a owl:DatatypeProperty ;
  rdfs:range xsd:dateTime ;
  a owl:FunctionalProperty .

cf:updated_at a owl:DatatypeProperty ;
  rdfs:range xsd:dateTime ;
  a owl:FunctionalProperty .

cf:content_hash a owl:DatatypeProperty ;
  rdfs:comment "SHA-256 of the source Markdown section, mirrors .doc-index.json content_hash." ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:source_doc a owl:DatatypeProperty ;
  rdfs:comment "Relative path of the Markdown file the entity was exported from." ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:source_section a owl:DatatypeProperty ;
  rdfs:comment "Section anchor inside the source doc, e.g. §2.F-001." ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:version a owl:DatatypeProperty ;
  rdfs:comment "Semantic version label for releasable artifacts." ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:tags a owl:DatatypeProperty ;
  rdfs:range xsd:string .

cf:authored_by a owl:DatatypeProperty ;
  rdfs:comment "Free-form attribution (role name or username); not coupled to governance namespace." ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:part_of a owl:ObjectProperty ;
  rdfs:range cf:SoftwareArtifact ;
  a owl:FunctionalProperty .

cf:has_part a owl:ObjectProperty ;
  owl:inverseOf cf:part_of ;
  rdfs:range cf:SoftwareArtifact .

cf:depends_on a owl:ObjectProperty ;
  rdfs:range cf:SoftwareArtifact .

cf:dependency_of a owl:ObjectProperty ;
  owl:inverseOf cf:depends_on ;
  rdfs:range cf:SoftwareArtifact .

dcterms:replaces a owl:ObjectProperty ;
  rdfs:range cf:SoftwareArtifact ;
  a owl:FunctionalProperty .

dcterms:isReplacedBy a owl:ObjectProperty ;
  owl:inverseOf dcterms:replaces ;
  rdfs:range cf:SoftwareArtifact ;
  a owl:FunctionalProperty .

prov:wasRevisionOf a owl:ObjectProperty ;
  rdfs:comment "PROV revision link between two snapshots of the same logical entity." ;
  rdfs:range cf:SoftwareArtifact ;
  a owl:FunctionalProperty .

cf:satisfies a owl:ObjectProperty ;
  rdfs:comment "This Feature/Component/Task addresses these Requirements." ;
  rdfs:range cf:Requirement .

cf:satisfied_by a owl:ObjectProperty ;
  owl:inverseOf cf:satisfies ;
  rdfs:range cf:SoftwareArtifact .

cf:refines a owl:ObjectProperty ;
  rdfs:comment "This artifact elaborates a more abstract upstream artifact." ;
  rdfs:range cf:SoftwareArtifact ;
  a owl:FunctionalProperty .

cf:refined_by a owl:ObjectProperty ;
  owl:inverseOf cf:refines ;
  rdfs:range cf:SoftwareArtifact .

cf:implemented_by a owl:ObjectProperty ;
  rdfs:range cf:SoftwareArtifact ;
  owl:inverseOf cf:implements .

cf:implements a owl:ObjectProperty ;
  rdfs:range cf:SoftwareArtifact .

cf:realized_as a owl:ObjectProperty ;
  rdfs:comment "Component/Module → Task work-breakdown link." ;
  rdfs:range cf:Task ;
  owl:inverseOf cf:realizes .

cf:realizes a owl:ObjectProperty ;
  rdfs:range cf:SoftwareArtifact .

cf:verifies a owl:ObjectProperty ;
  rdfs:range cf:SoftwareArtifact .

cf:verified_by a owl:ObjectProperty ;
  owl:inverseOf cf:verifies ;
  rdfs:range cf:TestCase .

cf:delivers a owl:ObjectProperty ;
  rdfs:range cf:SoftwareArtifact .

cf:delivered_by a owl:ObjectProperty ;
  owl:inverseOf cf:delivers ;
  rdfs:range cf:SoftwareArtifact .

cf:affects a owl:ObjectProperty ;
  rdfs:comment "ChangeRequest / ArchitectureDecision impact edge." ;
  rdfs:range cf:SoftwareArtifact .

cf:affected_by a owl:ObjectProperty ;
  owl:inverseOf cf:affects ;
  rdfs:range cf:SoftwareArtifact .

cf:targets_artifact a owl:ObjectProperty ;
  rdfs:comment "ReviewReport → the artifact under review." ;
  rdfs:range cf:SoftwareArtifact ;
  a owl:FunctionalProperty .

cf:reviewed_by a owl:ObjectProperty ;
  owl:inverseOf cf:targets_artifact ;
  rdfs:range cf:ReviewReport .

cf:belongs_to_project a owl:ObjectProperty ;
  rdfs:range cf:Project ;
  a owl:FunctionalProperty .

cf:belongs_to_phase a owl:ObjectProperty ;
  rdfs:comment "Waterfall placement." ;
  rdfs:range cf:Phase ;
  a owl:FunctionalProperty .

cf:assigned_to_sprint a owl:ObjectProperty ;
  rdfs:comment "Agile placement." ;
  rdfs:range cf:Sprint ;
  a owl:FunctionalProperty .

cf:belongs_to_work_unit a owl:ObjectProperty ;
  rdfs:comment "Unified accessor (Phase or Sprint or Iteration)." ;
  rdfs:range cf:WorkUnit ;
  a owl:FunctionalProperty .

cf:process_model a owl:ObjectProperty ;
  rdfs:range cf:ProcessModelEnum ;
  a owl:FunctionalProperty .

cf:rationale a owl:DatatypeProperty ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:decision_outcome a owl:DatatypeProperty ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:alternatives a owl:DatatypeProperty ;
  rdfs:range xsd:string .

cf:acceptance_text a owl:DatatypeProperty ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:test_steps a owl:DatatypeProperty ;
  rdfs:range xsd:string .

cf:expected_result a owl:DatatypeProperty ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:test_result a owl:ObjectProperty ;
  rdfs:range cf:TestResultEnum ;
  a owl:FunctionalProperty .

cf:endpoint_path a owl:DatatypeProperty ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:http_method a owl:DatatypeProperty ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:request_schema a owl:DatatypeProperty ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:response_schema a owl:DatatypeProperty ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:field_definitions a owl:DatatypeProperty ;
  rdfs:range xsd:string .

cf:ui_route a owl:DatatypeProperty ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:layout_spec a owl:DatatypeProperty ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:risk_level a owl:ObjectProperty ;
  rdfs:range cf:RiskLevelEnum ;
  a owl:FunctionalProperty .

cf:mitigation a owl:DatatypeProperty ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:environment a owl:ObjectProperty ;
  rdfs:range cf:EnvironmentEnum ;
  a owl:FunctionalProperty .

cf:pipeline_steps a owl:DatatypeProperty ;
  rdfs:range xsd:string .

cf:release_notes a owl:DatatypeProperty ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:task_status a owl:ObjectProperty ;
  rdfs:range cf:TaskStatusEnum ;
  a owl:FunctionalProperty .

cf:change_status a owl:ObjectProperty ;
  rdfs:range cf:ChangeStatusEnum ;
  a owl:FunctionalProperty .

cf:start_date a owl:DatatypeProperty ;
  rdfs:range xsd:date ;
  a owl:FunctionalProperty .

cf:end_date a owl:DatatypeProperty ;
  rdfs:range xsd:date ;
  a owl:FunctionalProperty .

cf:glossary_term a owl:DatatypeProperty ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:glossary_definition a owl:DatatypeProperty ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:narrative_body a owl:DatatypeProperty ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:stack_layers a owl:DatatypeProperty ;
  rdfs:range xsd:string .

cf:doc_type a owl:DatatypeProperty ;
  rdfs:comment "doc_type of a Document, e.g. prd / arch." ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:section_anchor a owl:DatatypeProperty ;
  rdfs:comment "Section anchor inside its document, e.g. §2.M-001." ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:position a owl:DatatypeProperty ;
  rdfs:comment "Zero-padded document-order index of a Section for whole-document reconstruction." ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:section_level a owl:DatatypeProperty ;
  rdfs:comment "Heading depth of a Section; level-2 sections tile-cover the document body." ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:frontmatter_raw a owl:DatatypeProperty ;
  rdfs:comment "Verbatim frontmatter block of a Document's source file." ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:preamble_body a owl:DatatypeProperty ;
  rdfs:comment "Document body before the first §-level heading (H1 line and lead prose)." ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:source_path a owl:DatatypeProperty ;
  rdfs:comment "Project-root-relative posix path of a Document's source file." ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:has_section a owl:ObjectProperty ;
  rdfs:comment "Document → its sections." ;
  rdfs:range cf:Section .

cf:part_of_document a owl:ObjectProperty ;
  rdfs:comment "Section → the document it belongs to." ;
  rdfs:range cf:Document ;
  a owl:FunctionalProperty .

cf:contains_entity a owl:ObjectProperty ;
  rdfs:comment "Section → the structured entities sourced from it." ;
  rdfs:range cf:SoftwareArtifact ;
  owl:inverseOf cf:located_in_section .

cf:located_in_section a owl:ObjectProperty ;
  rdfs:comment "SoftwareArtifact → the Section it was sourced from." ;
  rdfs:range cf:Section ;
  a owl:FunctionalProperty .

cf:domain_type a owl:DatatypeProperty ;
  rdfs:comment "Registered domain class of a DomainEntity (e.g. \"Order\"), set from the prefix registry." ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:has_attribute a owl:ObjectProperty ;
  rdfs:comment "DomainEntity → its structured key/value attributes." ;
  rdfs:range cf:DomainAttribute .

cf:attribute_of a owl:ObjectProperty ;
  rdfs:comment "DomainAttribute → its owning DomainEntity." ;
  owl:inverseOf cf:has_attribute ;
  rdfs:range cf:DomainEntity ;
  a owl:FunctionalProperty .

cf:attr_name a owl:DatatypeProperty ;
  rdfs:comment "DomainAttribute key." ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:attr_value a owl:DatatypeProperty ;
  rdfs:comment "DomainAttribute value." ;
  rdfs:range xsd:string ;
  a owl:FunctionalProperty .

cf:ProcessModelEnum a owl:Class ;
  rdfs:comment "SDLC process model selected at project scope." ;
  owl:equivalentClass [
    a owl:Class ;
    owl:oneOf ( cf:ProcessModelEnum.WATERFALL cf:ProcessModelEnum.AGILE cf:ProcessModelEnum.HYBRID )
  ] .

cf:ProcessModelEnum.WATERFALL a owl:NamedIndividual ;
  skos:notation "waterfall" ;
  rdfs:comment "Phase-gated sequential." ;
  a cf:ProcessModelEnum .

cf:ProcessModelEnum.AGILE a owl:NamedIndividual ;
  skos:notation "agile" ;
  rdfs:comment "Sprint/Iteration based." ;
  a cf:ProcessModelEnum .

cf:ProcessModelEnum.HYBRID a owl:NamedIndividual ;
  skos:notation "hybrid" ;
  rdfs:comment "Mixed waterfall phases with internal sprints." ;
  a cf:ProcessModelEnum .

cf:ArtifactStatusEnum a owl:Class ;
  rdfs:comment "Lifecycle state of any SoftwareArtifact." ;
  owl:equivalentClass [
    a owl:Class ;
    owl:oneOf ( cf:ArtifactStatusEnum.DRAFT cf:ArtifactStatusEnum.PROPOSED cf:ArtifactStatusEnum.APPROVED cf:ArtifactStatusEnum.IMPLEMENTED cf:ArtifactStatusEnum.VERIFIED cf:ArtifactStatusEnum.RELEASED cf:ArtifactStatusEnum.DEPRECATED cf:ArtifactStatusEnum.SUPERSEDED )
  ] .

cf:ArtifactStatusEnum.DRAFT a owl:NamedIndividual ;
  skos:notation "draft" ;
  a cf:ArtifactStatusEnum .

cf:ArtifactStatusEnum.PROPOSED a owl:NamedIndividual ;
  skos:notation "proposed" ;
  a cf:ArtifactStatusEnum .

cf:ArtifactStatusEnum.APPROVED a owl:NamedIndividual ;
  skos:notation "approved" ;
  a cf:ArtifactStatusEnum .

cf:ArtifactStatusEnum.IMPLEMENTED a owl:NamedIndividual ;
  skos:notation "implemented" ;
  a cf:ArtifactStatusEnum .

cf:ArtifactStatusEnum.VERIFIED a owl:NamedIndividual ;
  skos:notation "verified" ;
  a cf:ArtifactStatusEnum .

cf:ArtifactStatusEnum.RELEASED a owl:NamedIndividual ;
  skos:notation "released" ;
  a cf:ArtifactStatusEnum .

cf:ArtifactStatusEnum.DEPRECATED a owl:NamedIndividual ;
  skos:notation "deprecated" ;
  a cf:ArtifactStatusEnum .

cf:ArtifactStatusEnum.SUPERSEDED a owl:NamedIndividual ;
  skos:notation "superseded" ;
  a cf:ArtifactStatusEnum .

cf:PriorityEnum a owl:Class ;
  owl:equivalentClass [
    a owl:Class ;
    owl:oneOf ( cf:PriorityEnum.CRITICAL cf:PriorityEnum.HIGH cf:PriorityEnum.MEDIUM cf:PriorityEnum.LOW )
  ] .

cf:PriorityEnum.CRITICAL a owl:NamedIndividual ;
  skos:notation "critical" ;
  a cf:PriorityEnum .

cf:PriorityEnum.HIGH a owl:NamedIndividual ;
  skos:notation "high" ;
  a cf:PriorityEnum .

cf:PriorityEnum.MEDIUM a owl:NamedIndividual ;
  skos:notation "medium" ;
  a cf:PriorityEnum .

cf:PriorityEnum.LOW a owl:NamedIndividual ;
  skos:notation "low" ;
  a cf:PriorityEnum .

cf:RiskLevelEnum a owl:Class ;
  owl:equivalentClass [
    a owl:Class ;
    owl:oneOf ( cf:RiskLevelEnum.HIGH cf:RiskLevelEnum.MEDIUM cf:RiskLevelEnum.LOW )
  ] .

cf:RiskLevelEnum.HIGH a owl:NamedIndividual ;
  skos:notation "high" ;
  a cf:RiskLevelEnum .

cf:RiskLevelEnum.MEDIUM a owl:NamedIndividual ;
  skos:notation "medium" ;
  a cf:RiskLevelEnum .

cf:RiskLevelEnum.LOW a owl:NamedIndividual ;
  skos:notation "low" ;
  a cf:RiskLevelEnum .

cf:TaskStatusEnum a owl:Class ;
  owl:equivalentClass [
    a owl:Class ;
    owl:oneOf ( cf:TaskStatusEnum.TODO cf:TaskStatusEnum.IN_PROGRESS cf:TaskStatusEnum.BLOCKED cf:TaskStatusEnum.REVIEW cf:TaskStatusEnum.DONE cf:TaskStatusEnum.CANCELLED )
  ] .

cf:TaskStatusEnum.TODO a owl:NamedIndividual ;
  skos:notation "todo" ;
  a cf:TaskStatusEnum .

cf:TaskStatusEnum.IN_PROGRESS a owl:NamedIndividual ;
  skos:notation "in_progress" ;
  a cf:TaskStatusEnum .

cf:TaskStatusEnum.BLOCKED a owl:NamedIndividual ;
  skos:notation "blocked" ;
  a cf:TaskStatusEnum .

cf:TaskStatusEnum.REVIEW a owl:NamedIndividual ;
  skos:notation "review" ;
  a cf:TaskStatusEnum .

cf:TaskStatusEnum.DONE a owl:NamedIndividual ;
  skos:notation "done" ;
  a cf:TaskStatusEnum .

cf:TaskStatusEnum.CANCELLED a owl:NamedIndividual ;
  skos:notation "cancelled" ;
  a cf:TaskStatusEnum .

cf:TestResultEnum a owl:Class ;
  owl:equivalentClass [
    a owl:Class ;
    owl:oneOf ( cf:TestResultEnum.PASS cf:TestResultEnum.FAIL cf:TestResultEnum.BLOCKED cf:TestResultEnum.SKIPPED cf:TestResultEnum.PENDING )
  ] .

cf:TestResultEnum.PASS a owl:NamedIndividual ;
  skos:notation "pass" ;
  a cf:TestResultEnum .

cf:TestResultEnum.FAIL a owl:NamedIndividual ;
  skos:notation "fail" ;
  a cf:TestResultEnum .

cf:TestResultEnum.BLOCKED a owl:NamedIndividual ;
  skos:notation "blocked" ;
  a cf:TestResultEnum .

cf:TestResultEnum.SKIPPED a owl:NamedIndividual ;
  skos:notation "skipped" ;
  a cf:TestResultEnum .

cf:TestResultEnum.PENDING a owl:NamedIndividual ;
  skos:notation "pending" ;
  a cf:TestResultEnum .

cf:EnvironmentEnum a owl:Class ;
  owl:equivalentClass [
    a owl:Class ;
    owl:oneOf ( cf:EnvironmentEnum.DEV cf:EnvironmentEnum.STAGING cf:EnvironmentEnum.PRODUCTION cf:EnvironmentEnum.PREVIEW )
  ] .

cf:EnvironmentEnum.DEV a owl:NamedIndividual ;
  skos:notation "dev" ;
  a cf:EnvironmentEnum .

cf:EnvironmentEnum.STAGING a owl:NamedIndividual ;
  skos:notation "staging" ;
  a cf:EnvironmentEnum .

cf:EnvironmentEnum.PRODUCTION a owl:NamedIndividual ;
  skos:notation "production" ;
  a cf:EnvironmentEnum .

cf:EnvironmentEnum.PREVIEW a owl:NamedIndividual ;
  skos:notation "preview" ;
  a cf:EnvironmentEnum .

cf:ChangeStatusEnum a owl:Class ;
  owl:equivalentClass [
    a owl:Class ;
    owl:oneOf ( cf:ChangeStatusEnum.OPEN cf:ChangeStatusEnum.UNDER_REVIEW cf:ChangeStatusEnum.APPROVED cf:ChangeStatusEnum.REJECTED cf:ChangeStatusEnum.APPLIED )
  ] .

cf:ChangeStatusEnum.OPEN a owl:NamedIndividual ;
  skos:notation "open" ;
  a cf:ChangeStatusEnum .

cf:ChangeStatusEnum.UNDER_REVIEW a owl:NamedIndividual ;
  skos:notation "under_review" ;
  a cf:ChangeStatusEnum .

cf:ChangeStatusEnum.APPROVED a owl:NamedIndividual ;
  skos:notation "approved" ;
  a cf:ChangeStatusEnum .

cf:ChangeStatusEnum.REJECTED a owl:NamedIndividual ;
  skos:notation "rejected" ;
  a cf:ChangeStatusEnum .

cf:ChangeStatusEnum.APPLIED a owl:NamedIndividual ;
  skos:notation "applied" ;
  a cf:ChangeStatusEnum .

dcterms:license a owl:AnnotationProperty .

vann:preferredNamespacePrefix a owl:AnnotationProperty .

vann:preferredNamespaceUri a owl:AnnotationProperty .

skos:notation a owl:AnnotationProperty .

sh:declare a owl:AnnotationProperty .

sh:prefix a owl:AnnotationProperty .

sh:namespace a owl:AnnotationProperty .

xsd:date a rdfs:Datatype .
