@prefix spectra: <https://w3id.org/spectra#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix vann: <http://purl.org/vocab/vann/> .

# =============================================================================
# Ontology Declaration
# =============================================================================

<https://w3id.org/spectra> a owl:Ontology ;
    rdfs:label "SPECTRA: A Traceability Ontology for 3GPP RAN Standardization"@en ;
    dcterms:title "SPECTRA: A Traceability Ontology for 3GPP RAN Standardization"@en ;
    dcterms:description "OWL 2 ontology modeling the 3GPP RAN standardization document lifecycle (Tdoc, Resolution, CR, LS, Section, Spec, TechnicalReport, TRImpact, Meeting, Company, WorkingGroup). Designed from RAN1 competency questions and validated by cross-WG instantiation against RAN2-RAN5 with no additional process-layer classes required. Also declares six entity-layer classes (RRCParameter, CapabilityItem, Feature, Procedure, PerformanceRequirement, ConformanceTest) modeling spec-body entities: ASN.1 IEs, UE capability items, named standardization features, protocol procedures, performance requirements, and conformance test specifications."@en ;
    dcterms:creator <https://orcid.org/0000-0002-3471-1498> ;
    dcterms:publisher <https://github.com/spectra-ontology> ;
    dcterms:issued "2026-05-08"^^xsd:date ;
    dcterms:modified "2026-08-24"^^xsd:date ;
    dcterms:rights "Creative Commons Attribution 4.0 International (CC BY 4.0)"@en ;
    dcterms:license <https://creativecommons.org/licenses/by/4.0/> ;
    vann:preferredNamespacePrefix "spectra" ;
    vann:preferredNamespaceUri "https://w3id.org/spectra#" ;
    owl:versionInfo "1.1.1" ;
    owl:versionIRI <https://w3id.org/spectra/1.1.1> ;
    owl:priorVersion <https://w3id.org/spectra/1.1.0> ;
    rdfs:seeAlso <https://github.com/spectra-ontology/spec-trace> .

<https://orcid.org/0000-0002-3471-1498> a foaf:Person ;
    foaf:name "Sihyeon Choi" .

<https://github.com/spectra-ontology> a foaf:Organization ;
    foaf:name "SPECTRA Ontology Project"@en ;
    foaf:homepage <https://github.com/spectra-ontology/spec-trace> .

# =============================================================================
# Classes (32 classes)
# =============================================================================

# -----------------------------------------------------------------------------
# Tdoc and Subclasses
# -----------------------------------------------------------------------------

spectra:Tdoc a owl:Class ;
    rdfs:label "TDoc"@en ;
    rdfs:comment "3GPP Technical Document - base class for all meeting documents"@en .

spectra:CR a owl:Class ;
    rdfs:subClassOf spectra:Tdoc ;
    rdfs:label "Change Request"@en ;
    rdfs:comment "Change Request document that modifies a 3GPP specification (TS/TR). Includes CR, draftCR, and pCR types."@en .

spectra:LS a owl:Class ;
    rdfs:subClassOf spectra:Tdoc ;
    rdfs:label "Liaison Statement"@en ;
    rdfs:comment "Liaison Statement for official communication between Working Groups or external organizations"@en .

spectra:Summary a owl:Class ;
    rdfs:subClassOf spectra:Tdoc ;
    rdfs:label "Summary"@en ;
    rdfs:comment "FL Summary or Moderator Summary document from Final Report"@en .

spectra:SessionNotes a owl:Class ;
    rdfs:subClassOf spectra:Tdoc ;
    rdfs:label "Session Notes"@en ;
    rdfs:comment "Session notes for ad-hoc discussions from Final Report"@en .

# -----------------------------------------------------------------------------
# Resolution Classes
# -----------------------------------------------------------------------------

spectra:Resolution a owl:Class ;
    rdfs:label "Resolution"@en ;
    rdfs:comment "Abstract base class for meeting resolutions (Agreement, Conclusion, WorkingAssumption)"@en .

spectra:Agreement a owl:Class ;
    rdfs:subClassOf spectra:Resolution ;
    rdfs:label "Agreement"@en ;
    rdfs:comment "Technical agreement reached in the meeting"@en .

spectra:Conclusion a owl:Class ;
    rdfs:subClassOf spectra:Resolution ;
    rdfs:label "Conclusion"@en ;
    rdfs:comment "Discussion conclusion (may or may not have consensus)"@en .

spectra:WorkingAssumption a owl:Class ;
    rdfs:subClassOf spectra:Resolution ;
    rdfs:label "Working Assumption"@en ;
    rdfs:comment "Tentative assumption that may be promoted to Agreement"@en .

# -----------------------------------------------------------------------------
# Reference Classes
# -----------------------------------------------------------------------------

spectra:Meeting a owl:Class ;
    rdfs:label "Meeting"@en ;
    rdfs:comment "3GPP Working Group meeting"@en .

spectra:Company a owl:Class ;
    rdfs:subClassOf foaf:Organization ;
    rdfs:label "Company"@en ;
    rdfs:comment "Company or organization that submits TDocs"@en .

spectra:Contact a owl:Class ;
    rdfs:subClassOf foaf:Person ;
    rdfs:label "Contact"@en ;
    rdfs:comment "Contact person responsible for a TDoc"@en .

spectra:WorkItem a owl:Class ;
    rdfs:label "Work Item"@en ;
    rdfs:comment "3GPP Work Item (WI) or Study Item (SI)"@en .

spectra:AgendaItem a owl:Class ;
    rdfs:label "Agenda Item"@en ;
    rdfs:comment "Meeting agenda item with hierarchical numbering (e.g., 9.1, 9.1.1)"@en .

spectra:Release a owl:Class ;
    rdfs:label "Release"@en ;
    rdfs:comment "3GPP Release version (e.g., Rel-18, Rel-19)"@en .

spectra:Spec a owl:Class ;
    rdfs:label "Specification"@en ;
    rdfs:comment "3GPP Technical Specification (TS) or Technical Report (TR)"@en .

spectra:WorkingGroup a owl:Class ;
    rdfs:label "Working Group"@en ;
    rdfs:comment "3GPP Working Group (e.g., RAN1, RAN2, SA2)"@en .

# -----------------------------------------------------------------------------
# Embedded Content Classes
# -----------------------------------------------------------------------------

spectra:Figure a owl:Class ;
    rdfs:label "Figure"@en ;
    rdfs:comment "Technical figure embedded in Final Report (captioned or structural >50KB)"@en .

spectra:Table a owl:Class ;
    rdfs:label "Table"@en ;
    rdfs:comment "Technical table embedded in Final Report (captioned or structural heuristic)"@en .

spectra:Chart a owl:Class ;
    rdfs:label "Chart"@en ;
    rdfs:comment "Chart embedded in Final Report (<c:chart> XML, no <a:blip> image)"@en .

# -----------------------------------------------------------------------------
# TS Structure Classes
# -----------------------------------------------------------------------------

spectra:Section a owl:Class ;
    rdfs:label "Section"@en ;
    rdfs:comment "A section within a 3GPP Technical Specification document, identified by heading style"@en .

spectra:TSTable a owl:Class ;
    rdfs:label "TS Table"@en ;
    rdfs:comment "A table within a 3GPP Technical Specification document, identified by TH-style caption"@en .

spectra:TSFigure a owl:Class ;
    rdfs:label "TS Figure"@en ;
    rdfs:comment "A figure within a 3GPP Technical Specification document, identified by figure caption"@en .

# -----------------------------------------------------------------------------
# CR Document Classes
# -----------------------------------------------------------------------------

spectra:CRPack a owl:Class ;
    rdfs:label "CR Pack"@en ;
    rdfs:comment "TSG CR Pack - a bundle of CRs submitted to TSG plenary meeting (e.g., RP-250233). Identified by Cover Sheet."@en .

# -----------------------------------------------------------------------------
# TR Document Classes
# -----------------------------------------------------------------------------

spectra:TechnicalReport a owl:Class ;
    rdfs:label "Technical Report"@en ;
    rdfs:comment "3GPP Technical Report (TR) - research/study documents that may lead to TS changes. Contains scope, conclusions, and TR-TS impact analysis."@en .

spectra:TRImpact a owl:Class ;
    rdfs:label "TR Impact"@en ;
    rdfs:comment "Reification node for TR→TS impact relationship with impactType attribute (NewTS, NewSection, ExtendSection, NoChange)."@en .

# -----------------------------------------------------------------------------
# Entity-Layer Classes (Spec-Body Entities)
# -----------------------------------------------------------------------------

spectra:RRCParameter a owl:Class ;
    rdfs:label "ASN.1 IE (RRC + interface IE)"@en ;
    rdfs:comment "3GPP ASN.1 IE body — covers RRC IE (38.331 CodebookConfig-r16, etc.), NGAP IE (38.413), XnAP IE (38.423), F1AP IE (38.473), E1AP IE (38.463). The class name 'RRCParameter' is retained for continuity, but the class semantically represents any 3GPP-spec ASN.1 IE. Independent class — not a subclass of Section."@en .

spectra:CapabilityItem a owl:Class ;
    rdfs:label "UE Capability Item"@en ;
    rdfs:comment "Individual UE capability row in 3GPP capability spec (e.g., 38.306 §4.2.7.2 BandNR `codebookParametersAddition-r16`, `ltm-MCG-IntraFreq-r18`). Independent class — not a subclass of Section."@en .

spectra:Feature a owl:Class ;
    rdfs:label "3GPP Standard Feature"@en ;
    rdfs:comment "A named 3GPP standardization feature spanning one or more IEs/Sections/Capabilities/Releases (e.g., 'Rel-16 Enhanced Type-II codebook', 'Rel-18 LTM', 'BFD/BFR'). Independent class — not a subclass of Tdoc/Section/CR. Instances are curated per working group in a feature catalog."@en .

spectra:Procedure a owl:Class ;
    rdfs:label "Procedure"@en ;
    rdfs:comment "A protocol procedure spanning one or more sections (e.g., 'BFR Procedure' in 38.321 §5.17, 'RACH Procedure' in 38.321 §5.1). Independent class; a procedure may span multiple sections."@en .

spectra:PerformanceRequirement a owl:Class ;
    rdfs:label "RRM/RF Performance Requirement"@en ;
    rdfs:comment "Quantitative performance requirements specs body (38.133 RRM perf req, 38.101-x RF/EMC requirements, 38.104 BS RF requirements). Includes evaluation periods (TEvaluate_*), scaling factors (FR1/FR2/FR2-1/FR2-2), scheduling availability windows, minimum requirements per RS type, timing budgets (e.g., T = T1 × Ceil((T2+D)/T1)). Independent class. Distinct from CapabilityItem (UE capability declarations) and Procedure (protocol procedures)."@en .

spectra:ConformanceTest a owl:Class ;
    rdfs:label "Conformance Test Specification"@en ;
    rdfs:comment "3GPP conformance test specifications body — by spec body nature (test procedure / test environment / verdict / applicability), regardless of working group. Examples: RAN5 UE test (38.508-x, 38.509, 38.521-x, 38.523-1, 38.533), RAN4 BS test (38.141-1 conducted, 38.141-2 radiated, 38.181 AAS BS). Independent class. Distinct from Procedure (protocol procedure in spec body, not conformance test)."@en .

# =============================================================================
# Object Properties (53 properties)
# =============================================================================

# -----------------------------------------------------------------------------
# Tdoc Object Properties (10)
# -----------------------------------------------------------------------------

spectra:submittedBy a owl:ObjectProperty ;
    rdfs:label "submitted by"@en ;
    rdfs:comment "Company/organization that submitted the TDoc. Multiple companies can co-submit."@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range spectra:Company .

spectra:hasContact a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "has contact"@en ;
    rdfs:comment "Contact person responsible for the TDoc"@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range spectra:Contact .

spectra:relatedTo a owl:ObjectProperty ;
    rdfs:label "related to"@en ;
    rdfs:comment "Work Item(s) related to this TDoc"@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range spectra:WorkItem .

spectra:belongsTo a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "belongs to"@en ;
    rdfs:comment "Agenda Item under which this TDoc is discussed"@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range spectra:AgendaItem .

spectra:targetRelease a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "target release"@en ;
    rdfs:comment "Target 3GPP Release version for this TDoc or TechnicalReport"@en ;
    rdfs:domain [ a owl:Class ; owl:unionOf (spectra:Tdoc spectra:TechnicalReport) ] ;
    rdfs:range spectra:Release .

spectra:presentedAt a owl:ObjectProperty ;
    rdfs:label "presented at"@en ;
    rdfs:comment "Meeting where this TDoc was presented/discussed. Cardinality is 0..* in practice: a small fraction of TDocs are re-tabled at consecutive meetings under the same identifier (rare in the released RAN1 KG (1 case in current snapshot))."@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range spectra:Meeting .

spectra:isRevisionOf a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "is revision of"@en ;
    rdfs:comment "Previous version TDoc that this TDoc revises"@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range spectra:Tdoc ;
    owl:inverseOf spectra:revisedTo .

spectra:revisedTo a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "revised to"@en ;
    rdfs:comment "Newer version TDoc that revises this TDoc"@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range spectra:Tdoc ;
    owl:inverseOf spectra:isRevisionOf .

spectra:replyTo a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "reply to"@en ;
    rdfs:comment "TDoc that this TDoc replies to (typically for LS responses)"@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range spectra:Tdoc ;
    owl:inverseOf spectra:replyIn .

spectra:replyIn a owl:ObjectProperty ;
    rdfs:label "reply in"@en ;
    rdfs:comment "TDoc that replies to this TDoc (allows multiple replies across different WGs)"@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range spectra:Tdoc ;
    owl:inverseOf spectra:replyTo .

# -----------------------------------------------------------------------------
# CR-specific Object Property (1)
# -----------------------------------------------------------------------------

spectra:modifies a owl:ObjectProperty ;
    rdfs:label "modifies"@en ;
    rdfs:comment "Specification(s) that this CR modifies. Cardinality 1..*: a single CR may amend more than one Spec (e.g., paired stage-2 and stage-3 updates)."@en ;
    rdfs:domain spectra:CR ;
    rdfs:range spectra:Spec .

# -----------------------------------------------------------------------------
# LS-specific Object Properties (4)
# -----------------------------------------------------------------------------

spectra:sentTo a owl:ObjectProperty ;
    rdfs:label "sent to"@en ;
    rdfs:comment "Working Group(s) that receive this LS"@en ;
    rdfs:domain spectra:LS ;
    rdfs:range spectra:WorkingGroup .

spectra:ccTo a owl:ObjectProperty ;
    rdfs:label "cc to"@en ;
    rdfs:comment "Working Group(s) copied on this LS"@en ;
    rdfs:domain spectra:LS ;
    rdfs:range spectra:WorkingGroup .

spectra:originalLS a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "original LS"@en ;
    rdfs:comment "Original LS document from another WG (for LS in)"@en ;
    rdfs:domain spectra:LS ;
    rdfs:range spectra:Tdoc .

spectra:originatedFrom a owl:ObjectProperty ;
    rdfs:label "originated from"@en ;
    rdfs:comment "Working Group(s) that originated/sent this LS. Cardinality 0..*: cross-WG LSs are frequently issued by, or addressed to, multiple WGs simultaneously."@en ;
    rdfs:domain spectra:LS ;
    rdfs:range spectra:WorkingGroup .

# -----------------------------------------------------------------------------
# Summary-specific Object Property (1)
# -----------------------------------------------------------------------------

spectra:moderatedBy a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "moderated by"@en ;
    rdfs:comment "Company whose employee moderated this Summary discussion"@en ;
    rdfs:domain spectra:Summary ;
    rdfs:range spectra:Company .

# -----------------------------------------------------------------------------
# SessionNotes-specific Object Property (1)
# -----------------------------------------------------------------------------

spectra:chairedBy a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "chaired by"@en ;
    rdfs:comment "Company whose employee chaired this session"@en ;
    rdfs:domain spectra:SessionNotes ;
    rdfs:range spectra:Company .

# -----------------------------------------------------------------------------
# Resolution Object Properties (5) - Spec: Section 4.1
# -----------------------------------------------------------------------------

spectra:references a owl:ObjectProperty ;
    rdfs:label "references"@en ;
    rdfs:comment "TDoc(s) referenced in this Resolution content"@en ;
    rdfs:domain spectra:Resolution ;
    rdfs:range spectra:Tdoc .

spectra:resolutionBelongsTo a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "resolution belongs to"@en ;
    rdfs:comment "Agenda Item under which this Resolution was made"@en ;
    rdfs:domain spectra:Resolution ;
    rdfs:range spectra:AgendaItem ;
    owl:inverseOf spectra:hasResolutions .

spectra:madeAt a owl:ObjectProperty ;
    rdfs:label "made at"@en ;
    rdfs:comment "Meeting where this Resolution was made (1..*; admits dual-Meeting placement under hybrid e-meeting sessions)"@en ;
    rdfs:domain spectra:Resolution ;
    rdfs:range spectra:Meeting .

spectra:hasResolutions a owl:ObjectProperty ;
    rdfs:label "has resolutions"@en ;
    rdfs:comment "Resolutions made under this AgendaItem"@en ;
    rdfs:domain spectra:AgendaItem ;
    rdfs:range spectra:Resolution ;
    owl:inverseOf spectra:resolutionBelongsTo .

spectra:promotedTo a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "promoted to"@en ;
    rdfs:comment "Agreement that this WorkingAssumption was promoted to"@en ;
    rdfs:domain spectra:WorkingAssumption ;
    rdfs:range spectra:Agreement .

# -----------------------------------------------------------------------------
# Embedded Content Object Properties (4) - Spec: Section 5, 6
# -----------------------------------------------------------------------------

spectra:hasFigure a owl:ObjectProperty ;
    rdfs:label "has figure"@en ;
    rdfs:comment "Figure(s) referenced in this Resolution content"@en ;
    rdfs:domain spectra:Resolution ;
    rdfs:range spectra:Figure .

spectra:hasTable a owl:ObjectProperty ;
    rdfs:label "has table"@en ;
    rdfs:comment "Table(s) referenced in this Resolution content"@en ;
    rdfs:domain spectra:Resolution ;
    rdfs:range spectra:Table .

spectra:hasChart a owl:ObjectProperty ;
    rdfs:label "has chart"@en ;
    rdfs:comment "Chart(s) referenced in this Resolution content"@en ;
    rdfs:domain spectra:Resolution ;
    rdfs:range spectra:Chart .

spectra:containedIn a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "contained in"@en ;
    rdfs:comment "Meeting that contains this Figure/Table/Chart"@en ;
    rdfs:domain [ a owl:Class ; owl:unionOf ( spectra:Figure spectra:Table spectra:Chart ) ] ;
    rdfs:range spectra:Meeting .

# -----------------------------------------------------------------------------
# TS Structure Object Properties (10) - Spec: tdoc_ontology_specs(TS).md Step 5
# -----------------------------------------------------------------------------

spectra:hasSection a owl:ObjectProperty ;
    rdfs:label "has section"@en ;
    rdfs:comment "Top-level Section(s) contained in this Spec"@en ;
    rdfs:domain spectra:Spec ;
    rdfs:range spectra:Section ;
    owl:inverseOf spectra:belongsToSpec .

spectra:belongsToSpec a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "belongs to spec"@en ;
    rdfs:comment "Spec that this Section belongs to (exactly one)"@en ;
    rdfs:domain spectra:Section ;
    rdfs:range spectra:Spec ;
    owl:inverseOf spectra:hasSection .

spectra:hasSubSection a owl:ObjectProperty, owl:IrreflexiveProperty, owl:AsymmetricProperty ;
    rdfs:label "has sub-section"@en ;
    rdfs:comment "Direct child Section(s) of this Section"@en ;
    rdfs:domain spectra:Section ;
    rdfs:range spectra:Section ;
    owl:inverseOf spectra:parentSection .

spectra:parentSection a owl:ObjectProperty, owl:FunctionalProperty, owl:IrreflexiveProperty, owl:AsymmetricProperty ;
    rdfs:label "parent section"@en ;
    rdfs:comment "Direct parent Section (exactly one, null for level-1)"@en ;
    rdfs:domain spectra:Section ;
    rdfs:range spectra:Section ;
    owl:inverseOf spectra:hasSubSection .

spectra:referencesSection a owl:ObjectProperty, owl:IrreflexiveProperty ;
    rdfs:label "references section"@en ;
    rdfs:comment "Section(s) referenced by this Section's content (clause/subclause patterns)"@en ;
    rdfs:domain spectra:Section ;
    rdfs:range spectra:Section ;
    owl:inverseOf spectra:referencedBySection .

spectra:referencedBySection a owl:ObjectProperty, owl:IrreflexiveProperty ;
    rdfs:label "referenced by section"@en ;
    rdfs:comment "Section(s) that reference this Section"@en ;
    rdfs:domain spectra:Section ;
    rdfs:range spectra:Section ;
    owl:inverseOf spectra:referencesSection .

spectra:containsTable a owl:ObjectProperty ;
    rdfs:label "contains table"@en ;
    rdfs:comment "TSTable(s) contained in this Section"@en ;
    rdfs:domain spectra:Section ;
    rdfs:range spectra:TSTable ;
    owl:inverseOf spectra:tableInSection .

spectra:containsFigure a owl:ObjectProperty ;
    rdfs:label "contains figure"@en ;
    rdfs:comment "TSFigure(s) contained in this Section"@en ;
    rdfs:domain spectra:Section ;
    rdfs:range spectra:TSFigure ;
    owl:inverseOf spectra:figureInSection .

spectra:tableInSection a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "table in section"@en ;
    rdfs:comment "Section that contains this TSTable (exactly one)"@en ;
    rdfs:domain spectra:TSTable ;
    rdfs:range spectra:Section ;
    owl:inverseOf spectra:containsTable .

spectra:figureInSection a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "figure in section"@en ;
    rdfs:comment "Section that contains this TSFigure (exactly one)"@en ;
    rdfs:domain spectra:TSFigure ;
    rdfs:range spectra:Section ;
    owl:inverseOf spectra:containsFigure .

# -----------------------------------------------------------------------------
# CR Document Object Properties (7) - Spec: tdoc_ontology_specs(CR).md Step 5
# -----------------------------------------------------------------------------

spectra:hasCR a owl:ObjectProperty, owl:InverseFunctionalProperty ;
    rdfs:label "has CR"@en ;
    rdfs:comment "CR(s) included in this CRPack"@en ;
    rdfs:domain spectra:CRPack ;
    rdfs:range spectra:CR ;
    owl:inverseOf spectra:belongsToCRPack .

spectra:belongsToCRPack a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "belongs to CR pack"@en ;
    rdfs:comment "CRPack that this CR belongs to (at most one)"@en ;
    rdfs:domain spectra:CR ;
    rdfs:range spectra:CRPack ;
    owl:inverseOf spectra:hasCR .

spectra:affectsCoreSpec a owl:ObjectProperty ;
    rdfs:label "affects core spec"@en ;
    rdfs:comment "Core Specification(s) affected by this CR (from 'Other specs affected' section)"@en ;
    rdfs:domain spectra:CR ;
    rdfs:range spectra:Spec .

spectra:affectsTestSpec a owl:ObjectProperty ;
    rdfs:label "affects test spec"@en ;
    rdfs:comment "Test Specification(s) affected by this CR (from 'Other specs affected' section)"@en ;
    rdfs:domain spectra:CR ;
    rdfs:range spectra:Spec .

spectra:affectsOMSpec a owl:ObjectProperty ;
    rdfs:label "affects OM spec"@en ;
    rdfs:comment "O&M Specification(s) affected by this CR (from 'Other specs affected' section)"@en ;
    rdfs:domain spectra:CR ;
    rdfs:range spectra:Spec .

spectra:modifiesSection a owl:ObjectProperty ;
    rdfs:label "modifies section"@en ;
    rdfs:comment "Section(s) modified by this CR (derived from clausesAffected field)"@en ;
    rdfs:domain spectra:CR ;
    rdfs:range spectra:Section ;
    owl:inverseOf spectra:modifiedByCR .

spectra:modifiedByCR a owl:ObjectProperty ;
    rdfs:label "modified by CR"@en ;
    rdfs:comment "CR(s) that modify this Section"@en ;
    rdfs:domain spectra:Section ;
    rdfs:range spectra:CR ;
    owl:inverseOf spectra:modifiesSection .

# -----------------------------------------------------------------------------
# TR Document Object Properties (10) - Spec: tdoc_ontology_specs(TR).md
# -----------------------------------------------------------------------------

spectra:hasTRImpact a owl:ObjectProperty, owl:InverseFunctionalProperty ;
    rdfs:label "has TR impact"@en ;
    rdfs:comment "TRImpact node(s) for this TR's influence on TS/Section"@en ;
    rdfs:domain spectra:TechnicalReport ;
    rdfs:range spectra:TRImpact ;
    owl:inverseOf spectra:impactOfTR .

spectra:impactOfTR a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "impact of TR"@en ;
    rdfs:comment "TR that this TRImpact belongs to"@en ;
    rdfs:domain spectra:TRImpact ;
    rdfs:range spectra:TechnicalReport ;
    owl:inverseOf spectra:hasTRImpact .

spectra:impactsSpec a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "impacts spec"@en ;
    rdfs:comment "TS (Spec) affected by this TRImpact"@en ;
    rdfs:domain spectra:TRImpact ;
    rdfs:range spectra:Spec ;
    owl:inverseOf spectra:specImpactedBy .

spectra:specImpactedBy a owl:ObjectProperty ;
    rdfs:label "spec impacted by"@en ;
    rdfs:comment "TRImpact(s) that affect this Spec"@en ;
    rdfs:domain spectra:Spec ;
    rdfs:range spectra:TRImpact ;
    owl:inverseOf spectra:impactsSpec .

spectra:impactsSection a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "impacts section"@en ;
    rdfs:comment "Section affected by this TRImpact (optional, for NewSection/ExtendSection)"@en ;
    rdfs:domain spectra:TRImpact ;
    rdfs:range spectra:Section ;
    owl:inverseOf spectra:sectionImpactedBy .

spectra:sectionImpactedBy a owl:ObjectProperty ;
    rdfs:label "section impacted by"@en ;
    rdfs:comment "TRImpact(s) that affect this Section"@en ;
    rdfs:domain spectra:Section ;
    rdfs:range spectra:TRImpact ;
    owl:inverseOf spectra:impactsSection .

spectra:referencesTR a owl:ObjectProperty, owl:IrreflexiveProperty ;
    rdfs:label "references TR"@en ;
    rdfs:comment "Other TR(s) referenced by this TR (from References section)"@en ;
    rdfs:domain spectra:TechnicalReport ;
    rdfs:range spectra:TechnicalReport ;
    owl:inverseOf spectra:referencedByTR .

spectra:referencedByTR a owl:ObjectProperty, owl:IrreflexiveProperty ;
    rdfs:label "referenced by TR"@en ;
    rdfs:comment "TR(s) that reference this TR"@en ;
    rdfs:domain spectra:TechnicalReport ;
    rdfs:range spectra:TechnicalReport ;
    owl:inverseOf spectra:referencesTR .

spectra:relatedToWorkItem a owl:ObjectProperty ;
    rdfs:label "related to work item"@en ;
    rdfs:comment "Work Item (SI/WI) related to this TR, identified by RP-xxxxxx in TR Scope"@en ;
    rdfs:domain spectra:TechnicalReport ;
    rdfs:range spectra:WorkItem ;
    owl:inverseOf spectra:hasRelatedTR .

spectra:hasRelatedTR a owl:ObjectProperty ;
    rdfs:label "has related TR"@en ;
    rdfs:comment "TR(s) related to this Work Item (inverse of relatedToWorkItem)"@en ;
    rdfs:domain spectra:WorkItem ;
    rdfs:range spectra:TechnicalReport ;
    owl:inverseOf spectra:relatedToWorkItem .

# =============================================================================
# Data Properties (81 properties)
# =============================================================================

# -----------------------------------------------------------------------------
# Tdoc Data Properties (9)
# -----------------------------------------------------------------------------

spectra:tdocNumber a owl:DatatypeProperty ;
    rdfs:label "TDoc number"@en ;
    rdfs:comment "Unique identifier for the TDoc (e.g., R1-2500001). Format: R1-YYNNNNN"@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range xsd:string .

spectra:title a owl:DatatypeProperty ;
    rdfs:label "title"@en ;
    rdfs:comment "Title of the TDoc"@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range xsd:string .

spectra:abstract a owl:DatatypeProperty ;
    rdfs:label "abstract"@en ;
    rdfs:comment "Abstract/summary of the TDoc (often empty)"@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range xsd:string .

spectra:type a owl:DatatypeProperty ;
    rdfs:label "type"@en ;
    rdfs:comment "Type of the TDoc. Values: discussion, CR, draftCR, pCR, LS out, LS in, other, report, agenda, Work Plan, draft TR, draft TS, response, WID new, SID new, WI summary"@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range xsd:string .

spectra:status a owl:DatatypeProperty ;
    rdfs:label "status"@en ;
    rdfs:comment "Decision status. Values: approved, agreed, noted, revised, postponed, withdrawn, not treated, available, reserved, merged, not concluded, conditionally agreed, endorsed, not pursued, treated"@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range xsd:string .

spectra:for a owl:DatatypeProperty ;
    rdfs:label "for"@en ;
    rdfs:comment "Purpose of the TDoc. Values: Decision, Discussion, Approval, Agreement, Endorsement, Information, Presentation, Action"@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range xsd:string .

spectra:reservationDate a owl:DatatypeProperty ;
    rdfs:label "reservation date"@en ;
    rdfs:comment "Date/time when the TDoc number was reserved"@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range xsd:dateTime .

spectra:uploadedDate a owl:DatatypeProperty ;
    rdfs:label "uploaded date"@en ;
    rdfs:comment "Date/time when the TDoc file was uploaded"@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range xsd:dateTime .

spectra:secretaryRemarks a owl:DatatypeProperty ;
    rdfs:label "secretary remarks"@en ;
    rdfs:comment "Notes from the meeting secretary (e.g., 'Late contribution')"@en ;
    rdfs:domain spectra:Tdoc ;
    rdfs:range xsd:string .

# -----------------------------------------------------------------------------
# CR-specific Data Properties (8)
# -----------------------------------------------------------------------------

spectra:crNumber a owl:DatatypeProperty ;
    rdfs:label "CR number"@en ;
    rdfs:comment "Official CR number (e.g., 0693). DraftCR and pCR may not have this."@en ;
    rdfs:domain spectra:CR ;
    rdfs:range xsd:string .

spectra:crCategory a owl:DatatypeProperty ;
    rdfs:label "CR category"@en ;
    rdfs:comment "CR category. Values: F (Fix), A (Mirror), B (Addition), C (Functional modification), D (Editorial), E (Early implementation)"@en ;
    rdfs:domain spectra:CR ;
    rdfs:range xsd:string .

spectra:crRevision a owl:DatatypeProperty ;
    rdfs:label "CR revision"@en ;
    rdfs:comment "CR revision number (1-9). Indicates how many times this CR has been revised."@en ;
    rdfs:domain spectra:CR ;
    rdfs:range xsd:string .

spectra:clausesAffected a owl:DatatypeProperty ;
    rdfs:label "clauses affected"@en ;
    rdfs:comment "Specification clauses affected by this CR (e.g., '5.3.1, 5.3.2')"@en ;
    rdfs:domain spectra:CR ;
    rdfs:range xsd:string .

spectra:tsgCRPack a owl:DatatypeProperty ;
    rdfs:label "TSG CR pack"@en ;
    rdfs:comment "TSG CR Pack number (e.g., RP-250233) for approved CRs"@en ;
    rdfs:domain spectra:CR ;
    rdfs:range xsd:string .

spectra:affectsUICC a owl:DatatypeProperty ;
    rdfs:label "affects UICC"@en ;
    rdfs:comment "Whether this CR affects UICC (Universal Integrated Circuit Card)"@en ;
    rdfs:domain spectra:CR ;
    rdfs:range xsd:boolean .

spectra:affectsME a owl:DatatypeProperty ;
    rdfs:label "affects ME"@en ;
    rdfs:comment "Whether this CR affects ME (Mobile Equipment)"@en ;
    rdfs:domain spectra:CR ;
    rdfs:range xsd:boolean .

spectra:affectsRAN a owl:DatatypeProperty ;
    rdfs:label "affects RAN"@en ;
    rdfs:comment "Whether this CR affects RAN (Radio Access Network)"@en ;
    rdfs:domain spectra:CR ;
    rdfs:range xsd:boolean .

spectra:affectsCN a owl:DatatypeProperty ;
    rdfs:label "affects CN"@en ;
    rdfs:comment "Whether this CR affects CN (Core Network)"@en ;
    rdfs:domain spectra:CR ;
    rdfs:range xsd:boolean .

# -----------------------------------------------------------------------------
# LS-specific Data Property (1)
# -----------------------------------------------------------------------------

spectra:direction a owl:DatatypeProperty ;
    rdfs:label "direction"@en ;
    rdfs:comment "LS direction. Values: in (received), out (sent)"@en ;
    rdfs:domain spectra:LS ;
    rdfs:range xsd:string .

# -----------------------------------------------------------------------------
# Meeting Data Properties (4)
# -----------------------------------------------------------------------------

spectra:meetingNumber a owl:DatatypeProperty ;
    rdfs:label "meeting number"@en ;
    rdfs:comment "Meeting identifier (e.g., RAN1#120)"@en ;
    rdfs:domain spectra:Meeting ;
    rdfs:range xsd:string .

spectra:workingGroup a owl:DatatypeProperty ;
    rdfs:label "working group"@en ;
    rdfs:comment "Working Group hosting the meeting (e.g., RAN1)"@en ;
    rdfs:domain spectra:Meeting ;
    rdfs:range xsd:string .

spectra:canonicalMeetingNumber a owl:DatatypeProperty ;
    rdfs:label "canonical meeting number"@en ;
    rdfs:comment "Normalized meeting number without -e suffix for COVID e-meeting matching (e.g., RAN1#101-e → RAN1#101). Used for Resolution linking."@en ;
    rdfs:domain spectra:Meeting ;
    rdfs:range xsd:string .

spectra:meetingNumberInt a owl:DatatypeProperty ;
    rdfs:label "meeting number integer"@en ;
    rdfs:comment "Numeric part of meeting number for proper sorting (e.g., RAN1#122 → 122, RAN1#122b → 122). Extracted via regex #(\\d+)."@en ;
    rdfs:domain spectra:Meeting ;
    rdfs:range xsd:integer .

# -----------------------------------------------------------------------------
# Company Data Properties (2)
# -----------------------------------------------------------------------------

spectra:companyName a owl:DatatypeProperty ;
    rdfs:label "company name"@en ;
    rdfs:comment "Canonical name of the company/organization"@en ;
    rdfs:domain spectra:Company ;
    rdfs:range xsd:string .

spectra:aliases a owl:DatatypeProperty ;
    rdfs:label "aliases"@en ;
    rdfs:comment "Alternative names/spellings for this company"@en ;
    rdfs:domain spectra:Company ;
    rdfs:range xsd:string .

# -----------------------------------------------------------------------------
# Contact Data Properties (2)
# -----------------------------------------------------------------------------

spectra:contactName a owl:DatatypeProperty ;
    rdfs:label "contact name"@en ;
    rdfs:comment "Name of the contact person"@en ;
    rdfs:domain spectra:Contact ;
    rdfs:range xsd:string .

spectra:contactId a owl:DatatypeProperty ;
    rdfs:label "contact ID"@en ;
    rdfs:comment "3GPP system unique ID for the contact"@en ;
    rdfs:domain spectra:Contact ;
    rdfs:range xsd:string .

# -----------------------------------------------------------------------------
# WorkItem Data Property (1)
# -----------------------------------------------------------------------------

spectra:workItemCode a owl:DatatypeProperty ;
    rdfs:label "work item code"@en ;
    rdfs:comment "Work Item code name (e.g., NR_MIMO_Ph5-Core)"@en ;
    rdfs:domain spectra:WorkItem ;
    rdfs:range xsd:string .

# -----------------------------------------------------------------------------
# AgendaItem Data Properties (2)
# -----------------------------------------------------------------------------

spectra:agendaNumber a owl:DatatypeProperty ;
    rdfs:label "agenda number"@en ;
    rdfs:comment "Hierarchical agenda number (e.g., 9.1, 9.1.1)"@en ;
    rdfs:domain spectra:AgendaItem ;
    rdfs:range xsd:string .

spectra:agendaDescription a owl:DatatypeProperty ;
    rdfs:label "agenda description"@en ;
    rdfs:comment "Description/title of the agenda item"@en ;
    rdfs:domain spectra:AgendaItem ;
    rdfs:range xsd:string .

# -----------------------------------------------------------------------------
# Release Data Property (1)
# -----------------------------------------------------------------------------

spectra:releaseName a owl:DatatypeProperty ;
    rdfs:label "release name"@en ;
    rdfs:comment "3GPP Release version name (e.g., Rel-18, Rel-19)"@en ;
    rdfs:domain spectra:Release ;
    rdfs:range xsd:string .

# -----------------------------------------------------------------------------
# Spec Data Properties (3)
# -----------------------------------------------------------------------------

spectra:specNumber a owl:DatatypeProperty ;
    rdfs:label "spec number"@en ;
    rdfs:comment "Specification number (e.g., 38.212)"@en ;
    rdfs:domain spectra:Spec ;
    rdfs:range xsd:string .

spectra:specVersion a owl:DatatypeProperty ;
    rdfs:label "spec version"@en ;
    rdfs:comment "Version of the specification (e.g., 18.5.0)"@en ;
    rdfs:domain spectra:Spec ;
    rdfs:range xsd:string .

spectra:specTitle a owl:DatatypeProperty ;
    rdfs:label "spec title"@en ;
    rdfs:comment "Title of the specification (e.g., 'Physical channels and modulation')"@en ;
    rdfs:domain spectra:Spec ;
    rdfs:range xsd:string .

# -----------------------------------------------------------------------------
# WorkingGroup Data Property (1)
# -----------------------------------------------------------------------------

spectra:wgName a owl:DatatypeProperty ;
    rdfs:label "WG name"@en ;
    rdfs:comment "Working Group name (e.g., RAN1, SA2)"@en ;
    rdfs:domain spectra:WorkingGroup ;
    rdfs:range xsd:string .

# =============================================================================
# Resolution/Role Data Properties
# =============================================================================

# -----------------------------------------------------------------------------
# Summary Data Properties (2)
# -----------------------------------------------------------------------------

spectra:summaryType a owl:DatatypeProperty ;
    rdfs:label "summary type"@en ;
    rdfs:comment "Type of summary: FL (Feature Lead) or Moderator"@en ;
    rdfs:domain spectra:Summary ;
    rdfs:range xsd:string .

spectra:roundNumber a owl:DatatypeProperty ;
    rdfs:label "round number"@en ;
    rdfs:comment "Round number for the summary (0, 1, 2, ...)"@en ;
    rdfs:domain spectra:Summary ;
    rdfs:range xsd:integer .

# -----------------------------------------------------------------------------
# Resolution Data Properties (4) - Spec: Section 4.1
# -----------------------------------------------------------------------------

spectra:resolutionId a owl:DatatypeProperty ;
    rdfs:label "resolution ID"@en ;
    rdfs:comment "Unique identifier for the resolution (e.g., AGR-112-8.1-001)"@en ;
    rdfs:domain spectra:Resolution ;
    rdfs:range xsd:string .

spectra:content a owl:DatatypeProperty ;
    rdfs:label "content"@en ;
    rdfs:comment "Resolution text with equations replaced by [EQUATION] markers. For Text-to-Cypher search (Spec §8)."@en ;
    rdfs:domain spectra:Resolution ;
    rdfs:range xsd:string .

spectra:sessionContext a owl:DatatypeProperty ;
    rdfs:label "session context"@en ;
    rdfs:comment "Session information (e.g., 'Friday session', 'Online')"@en ;
    rdfs:domain spectra:Resolution ;
    rdfs:range xsd:string .

spectra:note a owl:DatatypeProperty ;
    rdfs:label "note"@en ;
    rdfs:comment "Additional note attached to the resolution"@en ;
    rdfs:domain spectra:Resolution ;
    rdfs:range xsd:string .

# -----------------------------------------------------------------------------
# Agreement Data Properties (2)
# -----------------------------------------------------------------------------

spectra:hasFFS a owl:DatatypeProperty ;
    rdfs:label "has FFS"@en ;
    rdfs:comment "Whether the agreement contains 'For Further Study' marker"@en ;
    rdfs:domain spectra:Agreement ;
    rdfs:range xsd:boolean .

spectra:hasTBD a owl:DatatypeProperty ;
    rdfs:label "has TBD"@en ;
    rdfs:comment "Whether the agreement contains 'To Be Determined' marker"@en ;
    rdfs:domain spectra:Agreement ;
    rdfs:range xsd:boolean .

# -----------------------------------------------------------------------------
# Conclusion Data Property (1)
# -----------------------------------------------------------------------------

spectra:hasConsensus a owl:DatatypeProperty ;
    rdfs:label "has consensus"@en ;
    rdfs:comment "Whether consensus was reached for this conclusion"@en ;
    rdfs:domain spectra:Conclusion ;
    rdfs:range xsd:boolean .

# -----------------------------------------------------------------------------
# Reference Class Data Property Extensions
# -----------------------------------------------------------------------------

# =============================================================================
# Embedded Content Data Properties
# =============================================================================

# -----------------------------------------------------------------------------
# Resolution Extension (2) - Spec: Section 5.1
# -----------------------------------------------------------------------------

spectra:contentWithEquations a owl:DatatypeProperty ;
    rdfs:label "content with equations"@en ;
    rdfs:comment "Resolution content with OMML equations converted to inline LaTeX ($...$). For LLM answer generation and UI rendering (Spec §8)."@en ;
    rdfs:domain spectra:Resolution ;
    rdfs:range xsd:string .

spectra:sequence a owl:DatatypeProperty ;
    rdfs:label "sequence"@en ;
    rdfs:comment "Order within the same Agenda Item (1-based)"@en ;
    rdfs:domain spectra:Resolution ;
    rdfs:range xsd:integer .

# -----------------------------------------------------------------------------
# Figure Data Properties (4) - Spec: Section 5.2
# -----------------------------------------------------------------------------

spectra:figureId a owl:DatatypeProperty ;
    rdfs:label "figure ID"@en ;
    rdfs:comment "Figure unique identifier (e.g., FIG-112-001 for Report Figure, 38.214-F5-1 for TSFigure)"@en ;
    rdfs:domain [ a owl:Class ; owl:unionOf ( spectra:Figure spectra:TSFigure ) ] ;
    rdfs:range xsd:string .

spectra:figureNumber a owl:DatatypeProperty ;
    rdfs:label "figure number"@en ;
    rdfs:comment "Original figure number from caption (e.g., Figure 1 for Report, 5-1 for TSFigure)"@en ;
    rdfs:domain [ a owl:Class ; owl:unionOf ( spectra:Figure spectra:TSFigure ) ] ;
    rdfs:range xsd:string .

# Figure also uses shared properties: caption, filePath (defined below)

# -----------------------------------------------------------------------------
# Table Data Properties (3) - Spec: Section 5.2
# -----------------------------------------------------------------------------

spectra:tableId a owl:DatatypeProperty ;
    rdfs:label "table ID"@en ;
    rdfs:comment "Table unique identifier (e.g., TBL-112-001 for Report Table, 38.214-T5.1.3.2-1 for TSTable)"@en ;
    rdfs:domain [ a owl:Class ; owl:unionOf ( spectra:Table spectra:TSTable ) ] ;
    rdfs:range xsd:string .

spectra:tableNumber a owl:DatatypeProperty ;
    rdfs:label "table number"@en ;
    rdfs:comment "Original table number from caption (e.g., Table 7.8-1 for Report, 5.1.3.2-1 for TSTable)"@en ;
    rdfs:domain [ a owl:Class ; owl:unionOf ( spectra:Table spectra:TSTable ) ] ;
    rdfs:range xsd:string .

spectra:equations a owl:DatatypeProperty ;
    rdfs:label "equations"@en ;
    rdfs:comment "LaTeX equations found within the table cells (multi-valued)"@en ;
    rdfs:domain spectra:Table ;
    rdfs:range xsd:string .

# Table also uses shared properties: caption, filePath (defined below)

# -----------------------------------------------------------------------------
# Chart Data Properties (4) - Spec: Section 5.3
# -----------------------------------------------------------------------------

spectra:chartId a owl:DatatypeProperty ;
    rdfs:label "chart ID"@en ;
    rdfs:comment "Chart unique identifier (e.g., CHT-114b-001)"@en ;
    rdfs:domain spectra:Chart ;
    rdfs:range xsd:string .

spectra:chartPath a owl:DatatypeProperty ;
    rdfs:label "chart path"@en ;
    rdfs:comment "Path to the extracted chart XML file"@en ;
    rdfs:domain spectra:Chart ;
    rdfs:range xsd:string .

spectra:chartType a owl:DatatypeProperty ;
    rdfs:label "chart type"@en ;
    rdfs:comment "Chart type extracted from XML (scatterChart, lineChart, barChart, pieChart, etc.)"@en ;
    rdfs:domain spectra:Chart ;
    rdfs:range xsd:string .

spectra:chartNumber a owl:DatatypeProperty ;
    rdfs:label "chart number"@en ;
    rdfs:comment "Original number from caption (e.g., 6.3.2-1)"@en ;
    rdfs:domain spectra:Chart ;
    rdfs:range xsd:string .

# Chart also uses shared property: caption (defined below)

# -----------------------------------------------------------------------------
# Shared Data Properties (2) - Spec: Section 5.2, 5.3
# -----------------------------------------------------------------------------

spectra:caption a owl:DatatypeProperty ;
    rdfs:label "caption"@en ;
    rdfs:comment "Caption text for Figure, Table, or Chart (optional for Figure/Table, required for Chart)"@en ;
    rdfs:domain [ a owl:Class ; owl:unionOf ( spectra:Figure spectra:Table spectra:Chart ) ] ;
    rdfs:range xsd:string .

spectra:filePath a owl:DatatypeProperty ;
    rdfs:label "file path"@en ;
    rdfs:comment "Path to the extracted file (image for Figure, HTML for Table)"@en ;
    rdfs:domain [ a owl:Class ; owl:unionOf ( spectra:Figure spectra:Table ) ] ;
    rdfs:range xsd:string .

# =============================================================================
# TS Structure Data Properties
# =============================================================================

# -----------------------------------------------------------------------------
# Section Data Properties (5) - Spec: tdoc_ontology_specs(TS).md Step 5
# -----------------------------------------------------------------------------

spectra:sectionId a owl:DatatypeProperty ;
    rdfs:label "section ID"@en ;
    rdfs:comment "Section unique identifier (pattern: {specNumber}-{sectionNumber}, e.g., 38.214-5.1.3.2)"@en ;
    rdfs:domain spectra:Section ;
    rdfs:range xsd:string .

spectra:sectionNumber a owl:DatatypeProperty ;
    rdfs:label "section number"@en ;
    rdfs:comment "Section number from heading (e.g., 5.1.3.2, A.1, 8.1.4A). Body: ^[0-9]+(\\.[0-9]+)*[a-zA-Z]?$, Annex: ^[A-Z](\\.[0-9]+)*$"@en ;
    rdfs:domain spectra:Section ;
    rdfs:range xsd:string .

spectra:sectionTitle a owl:DatatypeProperty ;
    rdfs:label "section title"@en ;
    rdfs:comment "Section title text from heading (excluding sectionNumber)"@en ;
    rdfs:domain spectra:Section ;
    rdfs:range xsd:string .

spectra:level a owl:DatatypeProperty ;
    rdfs:label "level"@en ;
    rdfs:comment "Hierarchy level (1-6). Derived from heading style: Heading 1-5 → 1-5, H6/Heading 6 → 6, Heading 8/9 → 1 (Annex)"@en ;
    rdfs:domain spectra:Section ;
    rdfs:range xsd:integer .

spectra:isVoid a owl:DatatypeProperty ;
    rdfs:label "is void"@en ;
    rdfs:comment "Whether this section contains only 'Void' text (true) or has real content (false)"@en ;
    rdfs:domain spectra:Section ;
    rdfs:range xsd:boolean .

# -----------------------------------------------------------------------------
# TSTable Data Property (1) - Spec: tdoc_ontology_specs(TS).md Step 5
# Note: tableId, tableNumber are shared with Table (domain expanded above)
# -----------------------------------------------------------------------------

spectra:tableCaption a owl:DatatypeProperty ;
    rdfs:label "table caption"@en ;
    rdfs:comment "TS table caption text from TH-style paragraph (e.g., 'Supported CSI-RS resource configurations')"@en ;
    rdfs:domain spectra:TSTable ;
    rdfs:range xsd:string .

# -----------------------------------------------------------------------------
# TSFigure Data Property (1) - Spec: tdoc_ontology_specs(TS).md Step 5
# Note: figureId, figureNumber are shared with Figure (domain expanded above)
# -----------------------------------------------------------------------------

spectra:figureCaption a owl:DatatypeProperty ;
    rdfs:label "figure caption"@en ;
    rdfs:comment "TS figure caption text (e.g., 'PDSCH resource allocation procedure')"@en ;
    rdfs:domain spectra:TSFigure ;
    rdfs:range xsd:string .

# =============================================================================
# CR Document Data Properties
# =============================================================================

# -----------------------------------------------------------------------------
# CRPack Data Properties (2) - Spec: tdoc_ontology_specs(CR).md Step 5
# -----------------------------------------------------------------------------

spectra:crPackId a owl:DatatypeProperty ;
    rdfs:label "CR pack ID"@en ;
    rdfs:comment "CR Pack unique identifier from Cover Sheet directory name (e.g., RP-250233)"@en ;
    rdfs:domain spectra:CRPack ;
    rdfs:range xsd:string .

spectra:tsgMeeting a owl:DatatypeProperty ;
    rdfs:label "TSG meeting"@en ;
    rdfs:comment "TSG plenary meeting where this CR Pack was submitted (e.g., RAN#103)"@en ;
    rdfs:domain spectra:CRPack ;
    rdfs:range xsd:string .

# -----------------------------------------------------------------------------
# CR Extension Data Properties (3) - Spec: tdoc_ontology_specs(CR).md Step 5
# -----------------------------------------------------------------------------

spectra:reasonForChange a owl:DatatypeProperty ;
    rdfs:label "reason for change"@en ;
    rdfs:comment "Reason why this CR change is needed (from CR document 'Reason for change' field)"@en ;
    rdfs:domain spectra:CR ;
    rdfs:range xsd:string .

spectra:summaryOfChange a owl:DatatypeProperty ;
    rdfs:label "summary of change"@en ;
    rdfs:comment "Summary of the changes made by this CR (from CR document 'Summary of change' field)"@en ;
    rdfs:domain spectra:CR ;
    rdfs:range xsd:string .

spectra:consequencesIfNotApproved a owl:DatatypeProperty ;
    rdfs:label "consequences if not approved"@en ;
    rdfs:comment "Consequences if this CR is not approved (from CR document 'Consequences if not approved' field)"@en ;
    rdfs:domain spectra:CR ;
    rdfs:range xsd:string .

# =============================================================================
# TR Document Data Properties
# =============================================================================

# -----------------------------------------------------------------------------
# TechnicalReport Data Properties (8) - Spec: tdoc_ontology_specs(TR).md
# -----------------------------------------------------------------------------

spectra:trNumber a owl:DatatypeProperty ;
    rdfs:label "TR number"@en ;
    rdfs:comment "Technical Report number (e.g., 38.769, 38.901)"@en ;
    rdfs:domain spectra:TechnicalReport ;
    rdfs:range xsd:string .

spectra:trTitle a owl:DatatypeProperty ;
    rdfs:label "TR title"@en ;
    rdfs:comment "Full title of the Technical Report (e.g., 'Study on Ambient IoT')"@en ;
    rdfs:domain spectra:TechnicalReport ;
    rdfs:range xsd:string .

spectra:trVersion a owl:DatatypeProperty ;
    rdfs:label "TR version"@en ;
    rdfs:comment "Version of the TR (e.g., 2.0.0, 18.0.0)"@en ;
    rdfs:domain spectra:TechnicalReport ;
    rdfs:range xsd:string .

spectra:trStatus a owl:DatatypeProperty ;
    rdfs:label "TR status"@en ;
    rdfs:comment "Status of the TR. Values: Draft (v0.x.x), Completed (vX.0.0), Living (vX.Y.Z continuous updates)"@en ;
    rdfs:domain spectra:TechnicalReport ;
    rdfs:range xsd:string .

spectra:scope a owl:DatatypeProperty ;
    rdfs:label "scope"@en ;
    rdfs:comment "Scope/objectives of the TR research (from Scope section, 1-10 sentences)"@en ;
    rdfs:domain spectra:TechnicalReport ;
    rdfs:range xsd:string .

spectra:conclusions a owl:DatatypeProperty ;
    rdfs:label "conclusions"@en ;
    rdfs:comment "Research conclusions of the TR (from Conclusions section, 1-10 sentences)"@en ;
    rdfs:domain spectra:TechnicalReport ;
    rdfs:range xsd:string .

spectra:studyItemRpNumber a owl:DatatypeProperty ;
    rdfs:label "study item RP number"@en ;
    rdfs:comment "Study Item RP number from TR Scope (pattern: RP-xxxxxx, e.g., RP-213599)"@en ;
    rdfs:domain spectra:TechnicalReport ;
    rdfs:range xsd:string .

spectra:workItemRpNumber a owl:DatatypeProperty ;
    rdfs:label "work item RP number"@en ;
    rdfs:comment "Work Item RP number from TR Scope (pattern: RP-xxxxxx, e.g., RP-213599)"@en ;
    rdfs:domain spectra:TechnicalReport ;
    rdfs:range xsd:string .

# -----------------------------------------------------------------------------
# TRImpact Data Properties (4) - Spec: tdoc_ontology_specs(TR).md
# -----------------------------------------------------------------------------

spectra:trImpactId a owl:DatatypeProperty ;
    rdfs:label "TR impact ID"@en ;
    rdfs:comment "Unique identifier for TRImpact (e.g., 38.769-38.291, 38.885-38.211-S8)"@en ;
    rdfs:domain spectra:TRImpact ;
    rdfs:range xsd:string .

spectra:impactType a owl:DatatypeProperty ;
    rdfs:label "impact type"@en ;
    rdfs:comment "Type of impact on TS. Values: NewTS (new spec created), NewSection (new section added), ExtendSection (existing section extended), NoChange (reference only)"@en ;
    rdfs:domain spectra:TRImpact ;
    rdfs:range xsd:string .

spectra:affectedSection a owl:DatatypeProperty ;
    rdfs:label "affected section"@en ;
    rdfs:comment "Section number affected by this TR impact (e.g., 5.2, 8.1)"@en ;
    rdfs:domain spectra:TRImpact ;
    rdfs:range xsd:string .

spectra:impactDescription a owl:DatatypeProperty ;
    rdfs:label "impact description"@en ;
    rdfs:comment "Description of how the TR impacts the TS/Section"@en ;
    rdfs:domain spectra:TRImpact ;
    rdfs:range xsd:string .

# =============================================================================
# Optional PROV-O alignment (declarative; reasoners may exploit these axioms,
# but SPECTRA core remains usable without PROV-O).
# Resolution is the meeting-decision activity; Tdoc is a contributed entity;
# Company/Contact are agents.
# =============================================================================

spectra:Resolution rdfs:subClassOf prov:Activity .
spectra:Tdoc       rdfs:subClassOf prov:Entity .
spectra:Company    rdfs:subClassOf prov:Agent ,
                                prov:Organization .
spectra:Contact    rdfs:subClassOf prov:Agent ,
                                prov:Person .

# =============================================================================
# End of SPECTRA ontology
# =============================================================================
