@prefix bot: <https://w3id.org/bot#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix ifcowl: <https://w3id.org/ifc/IFC4_ADD2#> .
@prefix pbs: <https://schema.pragmaticbim.ch/> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix schema: <https://schema.org/> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

pbs:AcousticProperty a sh:NodeShape ;
    rdfs:comment "Normalized acoustic-related property." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "Raw source value before normalization." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:source_value_raw ],
        [ sh:datatype xsd:string ;
            sh:description "String value when property_value_type is string." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:property_value_string ],
        [ sh:description "Value type discriminator for normalized storage (for example string, number, boolean)." ;
            sh:in ( pbs:performance_property_value_type_string pbs:performance_property_value_type_number pbs:performance_property_value_type_boolean ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 1 ;
            sh:path pbs:property_value_type ],
        [ sh:datatype xsd:boolean ;
            sh:description "Boolean value when property_value_type is boolean." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:property_value_boolean ],
        [ sh:datatype xsd:string ;
            sh:description "Normalized unit where applicable (for example min, dB, W/m2K)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:property_unit ],
        [ sh:datatype xsd:string ;
            sh:description "Original property name inside the source PropertySet (for example FireRating)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:source_property ],
        [ sh:datatype xsd:string ;
            sh:description "Original IFC PropertySet name (for example Pset_WallCommon)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:source_pset ],
        [ sh:description "Canonical key inside the domain; constrained via subclass slot_usage to a domain-specific enum." ;
            sh:in ( pbs:acoustic_property_rating_db pbs:acoustic_property_impact_sound_rating_db pbs:acoustic_property_airborne_sound_rating_db ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:property_key ],
        [ sh:datatype xsd:double ;
            sh:description "Numeric value when property_value_type is number." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:property_value_number ],
        [ sh:description "Optional URI that identifies the normalized property unit in an external vocabulary such as QUDT." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:property_unit_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Mapping specification version used to derive the normalized property." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:mapping_version ] ;
    sh:targetClass pbs:AcousticProperty .

pbs:AdditionChange a sh:NodeShape ;
    rdfs:comment "New entity introduced in to_revision." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description """LinkML class name of the changed subject (for example Space, SeparatorWall, Artifact).
""" ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:affected_subject_type ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:description "Optional severity independent of change type." ;
            sh:in ( pbs:change_severity_unchanged pbs:change_severity_minor pbs:change_severity_major pbs:change_severity_rewritten ) ;
            sh:maxCount 1 ;
            sh:order 2 ;
            sh:path pbs:change_severity ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Timestamp when this change was detected." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path dcterms:created ],
        [ sh:datatype xsd:integer ;
            sh:description "Source revision number for this change." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:from_revision ],
        [ sh:description "Intent stability verdict from an automated judge (for example iterthink STABLE/NEW)." ;
            sh:in ( pbs:change_intent_verdict_stable pbs:change_intent_verdict_new_intent ) ;
            sh:maxCount 1 ;
            sh:order 3 ;
            sh:path pbs:intent_verdict ],
        [ sh:description "Category of change detected between two revisions." ;
            sh:in ( pbs:change_type_geometry_change pbs:change_type_property_change pbs:change_type_requirement_change pbs:change_type_match_change pbs:change_type_addition pbs:change_type_deletion ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 1 ;
            sh:path pbs:change_type ],
        [ sh:class pbs:Entity ;
            sh:description "Optional typed reference to the changed graph entity when the subject is in the project graph." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:affected_subject ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:string ;
            sh:description """Optional JSON-pointer-style path for nested targets (for example localized_descriptions[de], section.4.2.paragraph_1).
""" ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:affected_subject_path ],
        [ sh:datatype xsd:integer ;
            sh:description "Target revision number for this change." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 11 ;
            sh:path pbs:to_revision ],
        [ sh:class pbs:Task ;
            sh:description "Task entity that this change triggered or should trigger." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 12 ;
            sh:path pbs:triggered_task ],
        [ sh:datatype xsd:string ;
            sh:description "Identifier of the changed subject (entity id, document id, or external key)." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:affected_subject_id ],
        [ sh:description "URI identifying the tool or pipeline that produced this change record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 15 ;
            sh:path pbs:change_source ],
        [ sh:description "Artifact location when the subject is an Artifact entity or embedded field diff." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:artifact_storage_link ],
        [ sh:class pbs:Process ;
            sh:description "BPMN process instance that this change triggered or should trigger." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 13 ;
            sh:path pbs:triggered_process ] ;
    sh:targetClass pbs:AdditionChange .

pbs:Boundary a sh:NodeShape ;
    rdfs:comment "Physical element acting as a boundary treatment (for example covering)." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 7 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:LevelContext ;
            sh:description "Parent level/storey context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:parent_level ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:performance_properties ],
        [ sh:description "Classification of boundary element (e.g., covering)." ;
            sh:in ( ifcowl:IfcCoveringTypeEnum.FLOORING ifcowl:IfcCoveringTypeEnum.CEILING ifcowl:IfcCoveringTypeEnum.CLADDING ifcowl:IfcCoveringTypeEnum.ROOFING ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:boundary_type ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:description ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:id ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:classifications ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:metadata ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "physical" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:content_kind ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 21 ;
            sh:path pbs:status ],
        [ sh:class pbs:Space ;
            sh:description "Space bounded by this boundary element." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path pbs:bounded_space ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 11 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 10 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 17 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:BuiltAssetContext ;
            sh:description "Parent building context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:parent_building ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 20 ;
            sh:path pbs:revision ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:created_at ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:meaning_uri ] ;
    sh:targetClass pbs:Boundary .

pbs:BriefRequirement a sh:NodeShape ;
    rdfs:comment "Client or programme requirement, including free-standing brief items." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:description "URI or identifier for a programme or brief document." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 0 ;
            sh:path pbs:programme_ref ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:metadata ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 20 ;
            sh:path pbs:status ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:revision ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:modified_at ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:meaning_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Free-text requirement statement from client or programme." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:statement ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 17 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 6 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:Artifact ;
            sh:description "Optional source artifact backing this requirement." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:source_artifact ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 9 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:id ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 16 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "requirement" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:content_kind ] ;
    sh:targetClass pbs:BriefRequirement .

pbs:BuildingContext a sh:NodeShape ;
    rdfs:comment "Spatial context node constrained to building semantics." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:description "Optional zone classification; intended for SpatialContext nodes where context_type is zone." ;
            sh:in ( ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ifcowl:IfcGroup ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ) ;
            sh:maxCount 1 ;
            sh:order 1 ;
            sh:path pbs:zone_type ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:id ],
        [ sh:class pbs:LegalSiteContext ;
            sh:description "Parent legal site context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:parent_legal_site ],
        [ sh:class pbs:PerimeterContext ;
            sh:description "Parent perimeter context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:parent_perimeter ],
        [ sh:class pbs:ZoneContext ;
            sh:description "Parent zone context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:parent_zone ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 29 ;
            sh:path pbs:status ],
        [ sh:class pbs:CostRecord ;
            sh:description "Cost records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:cost_records ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 20 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "context" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 13 ;
            sh:path pbs:content_kind ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 21 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 27 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:Project ;
            sh:description "Parent project reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:parent_project ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 22 ;
            sh:path pbs:quantity_values ],
        [ sh:class pbs:LevelContext ;
            sh:description "Parent level/storey context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:parent_level ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 17 ;
            sh:path pbs:meaning_uri ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 28 ;
            sh:path pbs:revision ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:description ],
        [ sh:class pbs:Entity ;
            sh:description "Zone members; may include spaces, separations, systems, etc." ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:group_members ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:Material ;
            sh:description "Material definitions associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 11 ;
            sh:path pbs:materials ],
        [ sh:class pbs:TimeRecord ;
            sh:description "Time records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:time_records ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 26 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 23 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:BuiltAssetContext ;
            sh:description "Parent building context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:parent_building ],
        [ sh:description "Classification of context entity (perimeter, legal_site, building, civil_structure, level, zone)." ;
            sh:in ( ifcowl:IfcSite pbs:LegalSiteContext bot:Building ifcowl:IfcCivilElement bot:Storey bot:Zone ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:context_type ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 25 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:name ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 24 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:localized_descriptions ] ;
    sh:targetClass pbs:BuildingContext .

pbs:Change a sh:NodeShape ;
    rdfs:comment """Audit record observing the project graph moving between revisions. Not an Entity and not a graph node — it watches the graph. Use change_type together with the concrete subclass for interpretation.
""" ;
    sh:closed false ;
    sh:ignoredProperties ( pbs:ifc_attribute_name pbs:source_pset pbs:match_status pbs:to_value pbs:affected_requirement pbs:from_value pbs:affected_geometry_role pbs:related_requirement pbs:property_path pbs:source_property pbs:property_path_kind rdf:type ) ;
    sh:property [ sh:class pbs:Entity ;
            sh:description "Optional typed reference to the changed graph entity when the subject is in the project graph." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:affected_subject ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:description "Intent stability verdict from an automated judge (for example iterthink STABLE/NEW)." ;
            sh:in ( pbs:change_intent_verdict_stable pbs:change_intent_verdict_new_intent ) ;
            sh:maxCount 1 ;
            sh:order 3 ;
            sh:path pbs:intent_verdict ],
        [ sh:class pbs:Task ;
            sh:description "Task entity that this change triggered or should trigger." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 12 ;
            sh:path pbs:triggered_task ],
        [ sh:datatype xsd:string ;
            sh:description """Optional JSON-pointer-style path for nested targets (for example localized_descriptions[de], section.4.2.paragraph_1).
""" ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:affected_subject_path ],
        [ sh:description "URI identifying the tool or pipeline that produced this change record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 15 ;
            sh:path pbs:change_source ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:integer ;
            sh:description "Target revision number for this change." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 11 ;
            sh:path pbs:to_revision ],
        [ sh:datatype xsd:string ;
            sh:description """LinkML class name of the changed subject (for example Space, SeparatorWall, Artifact).
""" ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:affected_subject_type ],
        [ sh:description "Category of change detected between two revisions." ;
            sh:in ( pbs:change_type_geometry_change pbs:change_type_property_change pbs:change_type_requirement_change pbs:change_type_match_change pbs:change_type_addition pbs:change_type_deletion ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 1 ;
            sh:path pbs:change_type ],
        [ sh:class pbs:Process ;
            sh:description "BPMN process instance that this change triggered or should trigger." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 13 ;
            sh:path pbs:triggered_process ],
        [ sh:description "Optional severity independent of change type." ;
            sh:in ( pbs:change_severity_unchanged pbs:change_severity_minor pbs:change_severity_major pbs:change_severity_rewritten ) ;
            sh:maxCount 1 ;
            sh:order 2 ;
            sh:path pbs:change_severity ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Timestamp when this change was detected." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path dcterms:created ],
        [ sh:description "Artifact location when the subject is an Artifact entity or embedded field diff." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:artifact_storage_link ],
        [ sh:datatype xsd:integer ;
            sh:description "Source revision number for this change." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:from_revision ],
        [ sh:datatype xsd:string ;
            sh:description "Identifier of the changed subject (entity id, document id, or external key)." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:affected_subject_id ] ;
    sh:targetClass pbs:Change .

pbs:CivilStructureContext a sh:NodeShape ;
    rdfs:comment "Spatial context node constrained to civil structure semantics." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 21 ;
            sh:path pbs:geometry_representations ],
        [ sh:description "Optional zone classification; intended for SpatialContext nodes where context_type is zone." ;
            sh:in ( ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ifcowl:IfcGroup ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ) ;
            sh:maxCount 1 ;
            sh:order 1 ;
            sh:path pbs:zone_type ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 24 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:ZoneContext ;
            sh:description "Parent zone context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:parent_zone ],
        [ sh:class pbs:LegalSiteContext ;
            sh:description "Parent legal site context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:parent_legal_site ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 27 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:PerimeterContext ;
            sh:description "Parent perimeter context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:parent_perimeter ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:LevelContext ;
            sh:description "Parent level/storey context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:parent_level ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 20 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:id ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 23 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:TimeRecord ;
            sh:description "Time records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:time_records ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 17 ;
            sh:path pbs:meaning_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:description ],
        [ sh:class pbs:BuiltAssetContext ;
            sh:description "Parent building context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:parent_building ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:name ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 22 ;
            sh:path pbs:quantity_values ],
        [ sh:class pbs:Material ;
            sh:description "Material definitions associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 11 ;
            sh:path pbs:materials ],
        [ sh:class pbs:Project ;
            sh:description "Parent project reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:parent_project ],
        [ sh:class pbs:CostRecord ;
            sh:description "Cost records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:cost_records ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:description "Classification of context entity (perimeter, legal_site, building, civil_structure, level, zone)." ;
            sh:in ( ifcowl:IfcSite pbs:LegalSiteContext bot:Building ifcowl:IfcCivilElement bot:Storey bot:Zone ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:context_type ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 25 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:Entity ;
            sh:description "Zone members; may include spaces, separations, systems, etc." ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:group_members ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 29 ;
            sh:path pbs:status ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 26 ;
            sh:path pbs:created_at ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "context" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 13 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 28 ;
            sh:path pbs:revision ] ;
    sh:targetClass pbs:CivilStructureContext .

pbs:ConnectionPhysical a sh:NodeShape ;
    rdfs:comment "Physical connector providing functional connection between spaces (for example door, window, duct, pipe, cable)." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 22 ;
            sh:path pbs:created_at ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:id ],
        [ sh:class pbs:Material ;
            sh:description "Material of the opening infill within the frame (for example glazing for windows, door leaf or panel for doors). Applies to opening-type connectors (door, window)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:infill_material ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 21 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:BuiltAssetContext ;
            sh:description "Parent building context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:parent_building ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:classifications ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 25 ;
            sh:path pbs:status ],
        [ sh:description "IFC-derived physical connector form (for example door, window, duct, pipe, cable). Semantic role is expressed via connection_functional_types." ;
            sh:in ( ifcowl:IfcDoor ifcowl:IfcWindow ifcowl:IfcDuctSegment ifcowl:IfcPipeSegment ifcowl:IfcCableSegment ifcowl:IfcConduitSegment ifcowl:IfcOpeningElement ifcowl:IfcFlowSegment ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:connection_physical_type ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 24 ;
            sh:path pbs:revision ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:quantity_values ],
        [ sh:description "Functional connection role(s) between spaces (for example access, visual, ventilation, heating). Multiple values allowed (for example glazed door as access plus visual)." ;
            sh:in ( <https://example.org/abstract/connection-functional-type/electrical> <https://example.org/abstract/connection-functional-type/data> <https://example.org/abstract/connection-functional-type/ventilation> <https://example.org/abstract/connection-functional-type/heating> <https://example.org/abstract/connection-functional-type/cooling> <https://example.org/abstract/connection-functional-type/fresh_water> <https://example.org/abstract/connection-functional-type/waste_water> <https://example.org/abstract/connection-functional-type/special_media> <https://example.org/abstract/connection-functional-type/access> <https://example.org/abstract/connection-functional-type/visual> ) ;
            sh:minCount 1 ;
            sh:order 1 ;
            sh:path pbs:connection_functional_types ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "physical" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:content_kind ],
        [ sh:description "Primary transport medium carried or enabled by the connector (for example human_access, air, liquid, electricity)." ;
            sh:in ( pbs:transport_medium_human_access pbs:transport_medium_daylight_view pbs:transport_medium_air pbs:transport_medium_liquid pbs:transport_medium_gas pbs:transport_medium_electricity pbs:transport_medium_data ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 2 ;
            sh:path pbs:transport_medium ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 15 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:LevelContext ;
            sh:description "Parent level/storey context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:parent_level ],
        [ sh:description """Performance requirement drivers for this physical connection element. Multiple values are allowed because one connection may need to satisfy several requirements.
""" ;
            sh:in ( pbs:connection_requirement_driver_fire pbs:connection_requirement_driver_security pbs:connection_requirement_driver_accessibility pbs:connection_requirement_driver_acoustic pbs:connection_requirement_driver_thermal pbs:connection_requirement_driver_visual pbs:connection_requirement_driver_structural ) ;
            sh:order 5 ;
            sh:path pbs:connection_physical_requirement_drivers ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 20 ;
            sh:path pbs:performance_properties ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 23 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 19 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:Material ;
            sh:description "Material of the frame or casing surrounding the opening. Applies to opening-type connectors (door, window)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:frame_material ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 13 ;
            sh:path pbs:meaning_uri ] ;
    sh:targetClass pbs:ConnectionPhysical .

pbs:ConnectionVirtual a sh:NodeShape ;
    rdfs:comment "Logical or topological connection between spaces and/or physical elements." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:geometry_representations ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 12 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 19 ;
            sh:path pbs:performance_properties ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 23 ;
            sh:path pbs:revision ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 10 ;
            sh:path pbs:localized_names ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 11 ;
            sh:path pbs:description ],
        [ sh:class pbs:Material ;
            sh:description "Material definitions associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:materials ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:classifications ],
        [ sh:description "Main requirement drivers for this virtual connection." ;
            sh:in ( pbs:connection_requirement_driver_fire pbs:connection_requirement_driver_security pbs:connection_requirement_driver_accessibility pbs:connection_requirement_driver_acoustic pbs:connection_requirement_driver_thermal pbs:connection_requirement_driver_visual pbs:connection_requirement_driver_structural ) ;
            sh:order 3 ;
            sh:path pbs:connection_virtual_requirement_drivers ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 24 ;
            sh:path pbs:status ],
        [ sh:class pbs:PhysicalElement ;
            sh:description "Physical elements connected by this virtual connection (for example wall-wall, wall-slab)." ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path pbs:connects_physical_elements ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 20 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 22 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:TimeRecord ;
            sh:description "Time records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:time_records ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:quantity_values ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:metadata ],
        [ sh:description "Classification of virtual connection semantics (for example structural_joint, adjacency, access)." ;
            sh:in ( pbs:connection_virtual_type_structural_joint pbs:connection_virtual_type_adjacency pbs:connection_virtual_type_access pbs:connection_virtual_type_other ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:connection_virtual_type ],
        [ sh:class pbs:CostRecord ;
            sh:description "Cost records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:cost_records ],
        [ sh:class pbs:Space ;
            sh:description "Spaces connected by this virtual connection." ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:connects_spaces ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 21 ;
            sh:path pbs:created_at ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "virtual" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:content_kind ] ;
    sh:targetClass pbs:ConnectionVirtual .

pbs:Contract a sh:NodeShape ;
    rdfs:comment """Commercial agreement entity for project scope, parties, and governance. Links to a signed artifact and related model entities via applies_to_entities. Entity.status covers record lifecycle; contract_status uses workflow vocabulary URIs.
""" ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:Agent ;
            sh:description "Agents party to the contract (for example client, contractor, consultant)." ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:contract_parties ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 20 ;
            sh:path pbs:performance_properties ],
        [ sh:datatype xsd:dateTime ;
            sh:description "End of contractual validity when applicable." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:effective_until ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:description ],
        [ sh:class pbs:Artifact ;
            sh:description "Optional signed contract artifact at storage_link." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:signed_artifact ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 15 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:name ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:localized_names ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Start of contractual validity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:effective_from ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 25 ;
            sh:path pbs:status ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Timestamp when the contract was signed." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:signed_at ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:classifications ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 13 ;
            sh:path pbs:meaning_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:string ;
            sh:description "Human-readable contract number or external reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:contract_reference ],
        [ sh:description "Contract type expressed as a URI/CURIE from a controlled vocabulary (for example design, construction, supply)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 0 ;
            sh:path dcterms:type ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 22 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:quantity_values ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 19 ;
            sh:path pbs:metadata ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "contract" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 24 ;
            sh:path pbs:revision ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 23 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 21 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:localized_descriptions ],
        [ sh:description "Contract status expressed as a URI/CURIE (for example draft, signed, active, terminated, superseded)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path <http://www.w3.org/ns/adms#status> ] ;
    sh:targetClass pbs:Contract .

pbs:CostRequirement a sh:NodeShape ;
    rdfs:comment "Cost or budget requirement (unit-cost cap, total budget limit, etc.)." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 23 ;
            sh:path pbs:status ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 9 ;
            sh:path pbs:localized_names ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 21 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:localized_descriptions ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 11 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:Artifact ;
            sh:description "Optional source artifact backing this requirement." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:source_artifact ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 20 ;
            sh:path pbs:created_at ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 22 ;
            sh:path pbs:revision ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 19 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "requirement" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:string ;
            sh:description "ISO 4217 currency code (for example EUR, USD)." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:currency ;
            sh:pattern "^[A-Z]{3}$" ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 13 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:quantity_values ],
        [ sh:description "Quantity type used as basis for this cost calculation." ;
            sh:in ( ifcowl:IfcQuantityArea ifcowl:IfcQuantityArea ifcowl:IfcQuantityArea ifcowl:IfcQuantityArea ifcowl:IfcQuantityVolume ifcowl:IfcQuantityVolume ifcowl:IfcQuantityLength ifcowl:IfcQuantityLength ifcowl:IfcQuantityLength ifcowl:IfcQuantityLength pbs:quantity_type_count pbs:quantity_type_ratio ) ;
            sh:maxCount 1 ;
            sh:order 4 ;
            sh:path pbs:cost_quantity_type ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:double ;
            sh:description "Numeric target value when applicable." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:target_value_number ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:string ;
            sh:description "Cost category label kept intentionally open pending classification-backed modeling." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:cost_category ],
        [ sh:description "Comparison operator for the requirement target." ;
            sh:in ( pbs:requirement_target_operator_equals pbs:requirement_target_operator_minimum pbs:requirement_target_operator_maximum pbs:requirement_target_operator_range ) ;
            sh:maxCount 1 ;
            sh:order 1 ;
            sh:path pbs:target_operator ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:metadata ] ;
    sh:targetClass pbs:CostRequirement .

pbs:DeletionChange a sh:NodeShape ;
    rdfs:comment "Entity removed in to_revision." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:description "Artifact location when the subject is an Artifact entity or embedded field diff." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:artifact_storage_link ],
        [ sh:description "URI identifying the tool or pipeline that produced this change record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 15 ;
            sh:path pbs:change_source ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:description "Optional severity independent of change type." ;
            sh:in ( pbs:change_severity_unchanged pbs:change_severity_minor pbs:change_severity_major pbs:change_severity_rewritten ) ;
            sh:maxCount 1 ;
            sh:order 2 ;
            sh:path pbs:change_severity ],
        [ sh:datatype xsd:string ;
            sh:description """Optional JSON-pointer-style path for nested targets (for example localized_descriptions[de], section.4.2.paragraph_1).
""" ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:affected_subject_path ],
        [ sh:datatype xsd:string ;
            sh:description """LinkML class name of the changed subject (for example Space, SeparatorWall, Artifact).
""" ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:affected_subject_type ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Timestamp when this change was detected." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path dcterms:created ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:string ;
            sh:description "Identifier of the changed subject (entity id, document id, or external key)." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:affected_subject_id ],
        [ sh:datatype xsd:integer ;
            sh:description "Target revision number for this change." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 11 ;
            sh:path pbs:to_revision ],
        [ sh:class pbs:Process ;
            sh:description "BPMN process instance that this change triggered or should trigger." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 13 ;
            sh:path pbs:triggered_process ],
        [ sh:description "Intent stability verdict from an automated judge (for example iterthink STABLE/NEW)." ;
            sh:in ( pbs:change_intent_verdict_stable pbs:change_intent_verdict_new_intent ) ;
            sh:maxCount 1 ;
            sh:order 3 ;
            sh:path pbs:intent_verdict ],
        [ sh:datatype xsd:integer ;
            sh:description "Source revision number for this change." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:from_revision ],
        [ sh:description "Category of change detected between two revisions." ;
            sh:in ( pbs:change_type_geometry_change pbs:change_type_property_change pbs:change_type_requirement_change pbs:change_type_match_change pbs:change_type_addition pbs:change_type_deletion ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 1 ;
            sh:path pbs:change_type ],
        [ sh:class pbs:Task ;
            sh:description "Task entity that this change triggered or should trigger." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 12 ;
            sh:path pbs:triggered_task ],
        [ sh:class pbs:Entity ;
            sh:description "Optional typed reference to the changed graph entity when the subject is in the project graph." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:affected_subject ] ;
    sh:targetClass pbs:DeletionChange .

pbs:Deliverable a sh:NodeShape ;
    rdfs:comment "Outcome or handover item produced within a project." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 17 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 16 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:revision ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:id ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 20 ;
            sh:path pbs:status ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 9 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:Project ;
            sh:description "Parent project reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path pbs:parent_project ],
        [ sh:datatype xsd:string ;
            sh:description "External or internal deliverable identifier within a project." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:deliverable_code ],
        [ sh:class pbs:Product ;
            sh:description "Optional catalog product this deliverable implements or this cost record is priced from." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:related_product ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:description ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:meaning_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "deliverable" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:classifications ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 6 ;
            sh:path pbs:localized_names ] ;
    sh:targetClass pbs:Deliverable .

pbs:DeliverableRequirement a sh:NodeShape ;
    rdfs:comment "Deliverable or documentation requirement (model LOD, O&M manual, export format, etc.)." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "Deliverable type label (for example coordination model, O&M manual, as-built record)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:deliverable_kind ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 18 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:Artifact ;
            sh:description "Optional source artifact backing this requirement." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:source_artifact ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:id ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 22 ;
            sh:path pbs:status ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:string ;
            sh:description "Required deliverable format or encoding (for example IFC4, PDF, COBie)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:deliverable_format ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 20 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:description ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:metadata ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:string ;
            sh:description "Criteria that define when the deliverable is accepted." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:acceptance_criteria ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Due timestamp for task completion." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path schema:deadline ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 8 ;
            sh:path pbs:localized_names ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 21 ;
            sh:path pbs:revision ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "requirement" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:content_kind ] ;
    sh:targetClass pbs:DeliverableRequirement .

pbs:Equipment a sh:NodeShape ;
    rdfs:comment "Endpoint or device element (for example terminal, unit, control device, sensor) located in a space and assigned to a system." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:LevelContext ;
            sh:description "Parent level/storey context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:parent_level ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:Space ;
            sh:description "Parent space where the equipment is located." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path pbs:parent_space ],
        [ sh:class pbs:BuiltAssetContext ;
            sh:description "Parent building context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:parent_building ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 8 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:System ;
            sh:description "Parent systems that the equipment belongs to." ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:parent_system ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:meaning_uri ],
        [ sh:description "Classification of equipment (for example HVAC, electrical, plumbing)." ;
            sh:in ( ifcowl:IfcDistributionElement ifcowl:IfcElectricalElement ifcowl:IfcFlowTerminal ifcowl:IfcFireSuppressionTerminal ifcowl:IfcDistributionControlElement ifcowl:IfcFurniture ifcowl:IfcElement ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:equipment_type ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:quantity_values ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:performance_properties ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 20 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 21 ;
            sh:path pbs:revision ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 18 ;
            sh:path pbs:applies_to_entities ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 22 ;
            sh:path pbs:status ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "physical" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:content_kind ] ;
    sh:targetClass pbs:Equipment .

pbs:FireProperty a sh:NodeShape ;
    rdfs:comment "Normalized fire-related property." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:double ;
            sh:description "Numeric value when property_value_type is number." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:property_value_number ],
        [ sh:datatype xsd:string ;
            sh:description "Original IFC PropertySet name (for example Pset_WallCommon)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:source_pset ],
        [ sh:datatype xsd:boolean ;
            sh:description "Boolean value when property_value_type is boolean." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:property_value_boolean ],
        [ sh:datatype xsd:string ;
            sh:description "Mapping specification version used to derive the normalized property." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:mapping_version ],
        [ sh:description "Canonical key inside the domain; constrained via subclass slot_usage to a domain-specific enum." ;
            sh:in ( pbs:fire_property_resistance_rating pbs:fire_property_smoke_rating pbs:fire_property_reaction_to_fire ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:property_key ],
        [ sh:datatype xsd:string ;
            sh:description "Original property name inside the source PropertySet (for example FireRating)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:source_property ],
        [ sh:datatype xsd:string ;
            sh:description "String value when property_value_type is string." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:property_value_string ],
        [ sh:datatype xsd:string ;
            sh:description "Normalized unit where applicable (for example min, dB, W/m2K)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:property_unit ],
        [ sh:description "Value type discriminator for normalized storage (for example string, number, boolean)." ;
            sh:in ( pbs:performance_property_value_type_string pbs:performance_property_value_type_number pbs:performance_property_value_type_boolean ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 1 ;
            sh:path pbs:property_value_type ],
        [ sh:description "Optional URI that identifies the normalized property unit in an external vocabulary such as QUDT." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:property_unit_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Raw source value before normalization." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:source_value_raw ] ;
    sh:targetClass pbs:FireProperty .

pbs:GeometryChange a sh:NodeShape ;
    rdfs:comment "Geometry or representation change for a subject." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:description "Category of change detected between two revisions." ;
            sh:in ( pbs:change_type_geometry_change pbs:change_type_property_change pbs:change_type_requirement_change pbs:change_type_match_change pbs:change_type_addition pbs:change_type_deletion ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 2 ;
            sh:path pbs:change_type ],
        [ sh:class pbs:Entity ;
            sh:description "Optional typed reference to the changed graph entity when the subject is in the project graph." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:affected_subject ],
        [ sh:description "Intent stability verdict from an automated judge (for example iterthink STABLE/NEW)." ;
            sh:in ( pbs:change_intent_verdict_stable pbs:change_intent_verdict_new_intent ) ;
            sh:maxCount 1 ;
            sh:order 4 ;
            sh:path pbs:intent_verdict ],
        [ sh:datatype xsd:string ;
            sh:description """LinkML class name of the changed subject (for example Space, SeparatorWall, Artifact).
""" ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:affected_subject_type ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Timestamp when this change was detected." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 15 ;
            sh:path dcterms:created ],
        [ sh:description "Optional severity independent of change type." ;
            sh:in ( pbs:change_severity_unchanged pbs:change_severity_minor pbs:change_severity_major pbs:change_severity_rewritten ) ;
            sh:maxCount 1 ;
            sh:order 3 ;
            sh:path pbs:change_severity ],
        [ sh:datatype xsd:integer ;
            sh:description "Source revision number for this change." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 11 ;
            sh:path pbs:from_revision ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:id ],
        [ sh:description "URI identifying the tool or pipeline that produced this change record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 16 ;
            sh:path pbs:change_source ],
        [ sh:description "Artifact location when the subject is an Artifact entity or embedded field diff." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:artifact_storage_link ],
        [ sh:description "Geometry role affected for GeometryChange records." ;
            sh:in ( "axis" "body_3d" "footprint_2d" "point" ) ;
            sh:maxCount 1 ;
            sh:order 0 ;
            sh:path pbs:affected_geometry_role ],
        [ sh:class pbs:Process ;
            sh:description "BPMN process instance that this change triggered or should trigger." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 14 ;
            sh:path pbs:triggered_process ],
        [ sh:class pbs:Task ;
            sh:description "Task entity that this change triggered or should trigger." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 13 ;
            sh:path pbs:triggered_task ],
        [ sh:datatype xsd:string ;
            sh:description """Optional JSON-pointer-style path for nested targets (for example localized_descriptions[de], section.4.2.paragraph_1).
""" ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:affected_subject_path ],
        [ sh:datatype xsd:string ;
            sh:description "Identifier of the changed subject (entity id, document id, or external key)." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:affected_subject_id ],
        [ sh:datatype xsd:integer ;
            sh:description "Target revision number for this change." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:to_revision ] ;
    sh:targetClass pbs:GeometryChange .

pbs:MatchChange a sh:NodeShape ;
    rdfs:comment """Entity match status against a requirement changed (previously met / no longer meets).
""" ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:description "Category of change detected between two revisions." ;
            sh:in ( pbs:change_type_geometry_change pbs:change_type_property_change pbs:change_type_requirement_change pbs:change_type_match_change pbs:change_type_addition pbs:change_type_deletion ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 3 ;
            sh:path pbs:change_type ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:datatype xsd:string ;
            sh:description "Identifier of the changed subject (entity id, document id, or external key)." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:affected_subject_id ],
        [ sh:description "Whether the subject met the requirement at the target revision." ;
            sh:in ( pbs:match_status_met pbs:match_status_unmet pbs:match_status_unknown ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 1 ;
            sh:path pbs:match_status ],
        [ sh:class pbs:Task ;
            sh:description "Task entity that this change triggered or should trigger." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 14 ;
            sh:path pbs:triggered_task ],
        [ sh:datatype xsd:integer ;
            sh:description "Source revision number for this change." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:from_revision ],
        [ sh:class pbs:Entity ;
            sh:description "Optional typed reference to the changed graph entity when the subject is in the project graph." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:affected_subject ],
        [ sh:datatype xsd:string ;
            sh:description """Optional JSON-pointer-style path for nested targets (for example localized_descriptions[de], section.4.2.paragraph_1).
""" ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:affected_subject_path ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Timestamp when this change was detected." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path dcterms:created ],
        [ sh:datatype xsd:integer ;
            sh:description "Target revision number for this change." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 13 ;
            sh:path pbs:to_revision ],
        [ sh:description "Intent stability verdict from an automated judge (for example iterthink STABLE/NEW)." ;
            sh:in ( pbs:change_intent_verdict_stable pbs:change_intent_verdict_new_intent ) ;
            sh:maxCount 1 ;
            sh:order 5 ;
            sh:path pbs:intent_verdict ],
        [ sh:class pbs:Process ;
            sh:description "BPMN process instance that this change triggered or should trigger." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 15 ;
            sh:path pbs:triggered_process ],
        [ sh:datatype xsd:string ;
            sh:description """LinkML class name of the changed subject (for example Space, SeparatorWall, Artifact).
""" ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:affected_subject_type ],
        [ sh:class pbs:Requirement ;
            sh:description "Requirement entity for match_change records." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 0 ;
            sh:path pbs:related_requirement ],
        [ sh:description "URI identifying the tool or pipeline that produced this change record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 17 ;
            sh:path pbs:change_source ],
        [ sh:description "Artifact location when the subject is an Artifact entity or embedded field diff." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 11 ;
            sh:path pbs:artifact_storage_link ],
        [ sh:description "Optional severity independent of change type." ;
            sh:in ( pbs:change_severity_unchanged pbs:change_severity_minor pbs:change_severity_major pbs:change_severity_rewritten ) ;
            sh:maxCount 1 ;
            sh:order 4 ;
            sh:path pbs:change_severity ] ;
    sh:targetClass pbs:MatchChange .

pbs:MaterialProperty a sh:NodeShape ;
    rdfs:comment "Normalized material-related property." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:description "Canonical key inside the domain; constrained via subclass slot_usage to a domain-specific enum." ;
            sh:in ( pbs:material_property_name pbs:material_property_class pbs:material_property_density pbs:material_property_thermal_conductivity ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:property_key ],
        [ sh:description "Optional URI that identifies the normalized property unit in an external vocabulary such as QUDT." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:property_unit_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Raw source value before normalization." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:source_value_raw ],
        [ sh:description "Value type discriminator for normalized storage (for example string, number, boolean)." ;
            sh:in ( pbs:performance_property_value_type_string pbs:performance_property_value_type_number pbs:performance_property_value_type_boolean ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 1 ;
            sh:path pbs:property_value_type ],
        [ sh:datatype xsd:boolean ;
            sh:description "Boolean value when property_value_type is boolean." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:property_value_boolean ],
        [ sh:datatype xsd:string ;
            sh:description "Original property name inside the source PropertySet (for example FireRating)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:source_property ],
        [ sh:datatype xsd:string ;
            sh:description "Mapping specification version used to derive the normalized property." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:mapping_version ],
        [ sh:datatype xsd:string ;
            sh:description "String value when property_value_type is string." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:property_value_string ],
        [ sh:datatype xsd:string ;
            sh:description "Normalized unit where applicable (for example min, dB, W/m2K)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:property_unit ],
        [ sh:datatype xsd:double ;
            sh:description "Numeric value when property_value_type is number." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:property_value_number ],
        [ sh:datatype xsd:string ;
            sh:description "Original IFC PropertySet name (for example Pset_WallCommon)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:source_pset ] ;
    sh:targetClass pbs:MaterialProperty .

pbs:MaterialRequirement a sh:NodeShape ;
    rdfs:comment "Material or product specification requirement for matching against assigned materials." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 22 ;
            sh:path pbs:status ],
        [ sh:class pbs:Entity ;
            sh:description "Optional Material entity template this requirement must match or satisfy." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:related_material ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 8 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:metadata ],
        [ sh:datatype xsd:boolean ;
            sh:description "Whether equivalent or substitute materials are permitted." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:substitutes_allowed ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 18 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:quantity_values ],
        [ sh:class pbs:Artifact ;
            sh:description "Optional source artifact backing this requirement." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:source_artifact ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 20 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "requirement" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:content_kind ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:string ;
            sh:description "Material category label kept intentionally open pending classification-backed modeling." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:material_category ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 21 ;
            sh:path pbs:revision ],
        [ sh:datatype xsd:string ;
            sh:description "Material grade, specification, or product description." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:material_specification ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:performance_properties ] ;
    sh:targetClass pbs:MaterialRequirement .

pbs:Message a sh:NodeShape ;
    rdfs:comment "Message entity for coordination and traceability. Links to related entities via applies_to_entities." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:Agent ;
            sh:description "Agent that sent the message." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path schema:sender ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:string ;
            sh:description "Optional subject or headline for the message." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path schema:headline ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Timestamp when the message was sent." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path schema:dateSent ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 9 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 22 ;
            sh:path pbs:revision ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:performance_properties ],
        [ sh:datatype xsd:string ;
            sh:description "Human-readable message content." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path schema:text ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 20 ;
            sh:path pbs:created_at ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 23 ;
            sh:path pbs:status ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "message" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:content_kind ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:metadata ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 13 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 11 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:Agent ;
            sh:description "Agents that received the message." ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path schema:recipient ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:name ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:classifications ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:quantity_values ],
        [ sh:description "Message type expressed as a URI/CURIE from a controlled vocabulary." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 0 ;
            sh:path dcterms:type ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 21 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 19 ;
            sh:path pbs:applies_to_entities ] ;
    sh:targetClass pbs:Message .

pbs:PerformanceRequirement a sh:NodeShape ;
    rdfs:comment "Performance target requirement (U-value, fire rating, airflow, acoustic, etc.). Boolean targets use target_value_boolean with requirement_property_key aligned to entity slot names where applicable (for example is_heated on Space). Application pipelines compare the subject entity slot to the requirement target and record the outcome as MatchChange (match_status met, unmet, or unknown)." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:double ;
            sh:description "Numeric target value when applicable." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:target_value_number ],
        [ sh:datatype xsd:string ;
            sh:description "Unit for numeric targets (for example W/m2K, min, dB)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:target_unit ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 15 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 23 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:description ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:localized_descriptions ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 13 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 19 ;
            sh:path pbs:metadata ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 25 ;
            sh:path pbs:status ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:boolean ;
            sh:description "Boolean target value when applicable." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:target_value_boolean ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "requirement" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:string ;
            sh:description """Canonical performance key for the target (for example u_value, resistance_rating). Aligns with performance property keys where applicable.
""" ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:requirement_property_key ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 22 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 21 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:localized_names ],
        [ sh:description "Optional URI identifying the target unit (for example QUDT)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:target_unit_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Textual target value when applicable." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:target_value_string ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 24 ;
            sh:path pbs:revision ],
        [ sh:class pbs:Artifact ;
            sh:description "Optional source artifact backing this requirement." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:source_artifact ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 20 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:geometry_representations ],
        [ sh:description "Comparison operator for the requirement target." ;
            sh:in ( pbs:requirement_target_operator_equals pbs:requirement_target_operator_minimum pbs:requirement_target_operator_maximum pbs:requirement_target_operator_range ) ;
            sh:maxCount 1 ;
            sh:order 1 ;
            sh:path pbs:target_operator ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:quantity_values ] ;
    sh:targetClass pbs:PerformanceRequirement .

pbs:PropertyChange a sh:NodeShape ;
    rdfs:comment "Attribute, PropertySet, schema slot, or document field change." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "Prior value serialized as text. Absent or null for new subjects or fields." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:from_value ],
        [ sh:description "Artifact location when the subject is an Artifact entity or embedded field diff." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 16 ;
            sh:path pbs:artifact_storage_link ],
        [ sh:datatype xsd:string ;
            sh:description """Canonical path to the changed field. Examples: Pset_WallCommon.FireRating, IfcWall.Name, description, section.4.2.requirement_3, body:char_offset:1204-1389.
""" ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:property_path ],
        [ sh:description "URI identifying the tool or pipeline that produced this change record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 22 ;
            sh:path pbs:change_source ],
        [ sh:datatype xsd:string ;
            sh:description "IFC property name within the PropertySet when property_path_kind is ifc_pset." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:source_property ],
        [ sh:class pbs:Process ;
            sh:description "BPMN process instance that this change triggered or should trigger." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 20 ;
            sh:path pbs:triggered_process ],
        [ sh:datatype xsd:string ;
            sh:description """Optional JSON-pointer-style path for nested targets (for example localized_descriptions[de], section.4.2.paragraph_1).
""" ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:affected_subject_path ],
        [ sh:description "Classification of the property path for downstream diff interpretation." ;
            sh:in ( pbs:property_path_kind_ifc_attribute pbs:property_path_kind_ifc_pset pbs:property_path_kind_schema_slot pbs:property_path_kind_document_field pbs:property_path_kind_text_span ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 1 ;
            sh:path pbs:property_path_kind ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Timestamp when this change was detected." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 21 ;
            sh:path dcterms:created ],
        [ sh:datatype xsd:string ;
            sh:description "IFC attribute name when property_path_kind is ifc_attribute (for example Name, GlobalId)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:ifc_attribute_name ],
        [ sh:datatype xsd:string ;
            sh:description "IFC PropertySet name when property_path_kind is ifc_pset." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:source_pset ],
        [ sh:datatype xsd:string ;
            sh:description "New value serialized as text. Absent or null for deleted subjects or fields." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:to_value ],
        [ sh:datatype xsd:integer ;
            sh:description "Source revision number for this change." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 17 ;
            sh:path pbs:from_revision ],
        [ sh:description "Optional severity independent of change type." ;
            sh:in ( pbs:change_severity_unchanged pbs:change_severity_minor pbs:change_severity_major pbs:change_severity_rewritten ) ;
            sh:maxCount 1 ;
            sh:order 9 ;
            sh:path pbs:change_severity ],
        [ sh:datatype xsd:string ;
            sh:description """LinkML class name of the changed subject (for example Space, SeparatorWall, Artifact).
""" ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 13 ;
            sh:path pbs:affected_subject_type ],
        [ sh:description "Intent stability verdict from an automated judge (for example iterthink STABLE/NEW)." ;
            sh:in ( pbs:change_intent_verdict_stable pbs:change_intent_verdict_new_intent ) ;
            sh:maxCount 1 ;
            sh:order 10 ;
            sh:path pbs:intent_verdict ],
        [ sh:datatype xsd:string ;
            sh:description "Identifier of the changed subject (entity id, document id, or external key)." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:affected_subject_id ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 15 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:id ],
        [ sh:class pbs:Entity ;
            sh:description "Optional typed reference to the changed graph entity when the subject is in the project graph." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 11 ;
            sh:path pbs:affected_subject ],
        [ sh:description "Category of change detected between two revisions." ;
            sh:in ( pbs:change_type_geometry_change pbs:change_type_property_change pbs:change_type_requirement_change pbs:change_type_match_change pbs:change_type_addition pbs:change_type_deletion ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 8 ;
            sh:path pbs:change_type ],
        [ sh:class pbs:Task ;
            sh:description "Task entity that this change triggered or should trigger." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 19 ;
            sh:path pbs:triggered_task ],
        [ sh:datatype xsd:integer ;
            sh:description "Target revision number for this change." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:to_revision ] ;
    sh:targetClass pbs:PropertyChange .

pbs:RegulatoryRequirement a sh:NodeShape ;
    rdfs:comment "Regulatory reference requirement (building code, norm, standard)." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 7 ;
            sh:path pbs:localized_names ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 11 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:quantity_values ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:meaning_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Jurisdiction or authority scope for the regulatory requirement." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:jurisdiction ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "requirement" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:content_kind ],
        [ sh:description "URI identifying the norm, standard, or building code." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 0 ;
            sh:path pbs:norm_uri ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 20 ;
            sh:path pbs:revision ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:name ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 17 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:Artifact ;
            sh:description "Optional source artifact backing this requirement." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:source_artifact ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:id ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:performance_properties ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 21 ;
            sh:path pbs:status ],
        [ sh:datatype xsd:string ;
            sh:description "Clause, article, or section reference within the norm." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:clause_ref ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 10 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:classifications ] ;
    sh:targetClass pbs:RegulatoryRequirement .

pbs:RequirementChange a sh:NodeShape ;
    rdfs:comment "Change to a requirement entity or its fields." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:Task ;
            sh:description "Task entity that this change triggered or should trigger." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 17 ;
            sh:path pbs:triggered_task ],
        [ sh:description "URI identifying the tool or pipeline that produced this change record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 20 ;
            sh:path pbs:change_source ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 13 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:description "Optional severity independent of change type." ;
            sh:in ( pbs:change_severity_unchanged pbs:change_severity_minor pbs:change_severity_major pbs:change_severity_rewritten ) ;
            sh:maxCount 1 ;
            sh:order 7 ;
            sh:path pbs:change_severity ],
        [ sh:datatype xsd:integer ;
            sh:description "Source revision number for this change." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 15 ;
            sh:path pbs:from_revision ],
        [ sh:datatype xsd:string ;
            sh:description """LinkML class name of the changed subject (for example Space, SeparatorWall, Artifact).
""" ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 11 ;
            sh:path pbs:affected_subject_type ],
        [ sh:datatype xsd:string ;
            sh:description "New value serialized as text. Absent or null for deleted subjects or fields." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:to_value ],
        [ sh:description "Classification of the property path for downstream diff interpretation." ;
            sh:in ( pbs:property_path_kind_ifc_attribute pbs:property_path_kind_ifc_pset pbs:property_path_kind_schema_slot pbs:property_path_kind_document_field pbs:property_path_kind_text_span ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 2 ;
            sh:path pbs:property_path_kind ],
        [ sh:class pbs:Entity ;
            sh:description "Optional typed reference to the changed graph entity when the subject is in the project graph." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:affected_subject ],
        [ sh:datatype xsd:string ;
            sh:description """Canonical path to the changed field. Examples: Pset_WallCommon.FireRating, IfcWall.Name, description, section.4.2.requirement_3, body:char_offset:1204-1389.
""" ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:property_path ],
        [ sh:class pbs:Process ;
            sh:description "BPMN process instance that this change triggered or should trigger." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 18 ;
            sh:path pbs:triggered_process ],
        [ sh:description "Category of change detected between two revisions." ;
            sh:in ( pbs:change_type_geometry_change pbs:change_type_property_change pbs:change_type_requirement_change pbs:change_type_match_change pbs:change_type_addition pbs:change_type_deletion ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 6 ;
            sh:path pbs:change_type ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:integer ;
            sh:description "Target revision number for this change." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:to_revision ],
        [ sh:datatype xsd:string ;
            sh:description "Identifier of the changed subject (entity id, document id, or external key)." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:affected_subject_id ],
        [ sh:class pbs:Requirement ;
            sh:description "Requirement entity affected by this change." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 0 ;
            sh:path pbs:affected_requirement ],
        [ sh:description "Artifact location when the subject is an Artifact entity or embedded field diff." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 14 ;
            sh:path pbs:artifact_storage_link ],
        [ sh:description "Intent stability verdict from an automated judge (for example iterthink STABLE/NEW)." ;
            sh:in ( pbs:change_intent_verdict_stable pbs:change_intent_verdict_new_intent ) ;
            sh:maxCount 1 ;
            sh:order 8 ;
            sh:path pbs:intent_verdict ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Timestamp when this change was detected." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path dcterms:created ],
        [ sh:datatype xsd:string ;
            sh:description """Optional JSON-pointer-style path for nested targets (for example localized_descriptions[de], section.4.2.paragraph_1).
""" ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:affected_subject_path ],
        [ sh:datatype xsd:string ;
            sh:description "Prior value serialized as text. Absent or null for new subjects or fields." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:from_value ] ;
    sh:targetClass pbs:RequirementChange .

pbs:ScheduleRequirement a sh:NodeShape ;
    rdfs:comment "Schedule obligation requirement (deadline, milestone, or start/finish window)." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "requirement" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Earliest permitted start when a schedule requirement defines a start window." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:earliest_start_at ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:id ],
        [ sh:class pbs:Entity ;
            sh:description "Optional TimeRecord plan item this schedule requirement aligns with or must satisfy." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:related_time_record ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:description ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:geometry_representations ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 21 ;
            sh:path pbs:status ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 11 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 10 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 17 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:Artifact ;
            sh:description "Optional source artifact backing this requirement." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:source_artifact ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Due timestamp for task completion." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path schema:deadline ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 20 ;
            sh:path pbs:revision ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 7 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:metadata ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:modified_at ] ;
    sh:targetClass pbs:ScheduleRequirement .

pbs:SecurityProperty a sh:NodeShape ;
    rdfs:comment "Normalized security-related property." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:double ;
            sh:description "Numeric value when property_value_type is number." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:property_value_number ],
        [ sh:description "Canonical key inside the domain; constrained via subclass slot_usage to a domain-specific enum." ;
            sh:in ( pbs:security_property_access_control_class pbs:security_property_intrusion_resistance_class pbs:security_property_surveillance_coverage ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:property_key ],
        [ sh:datatype xsd:string ;
            sh:description "Original property name inside the source PropertySet (for example FireRating)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:source_property ],
        [ sh:description "Value type discriminator for normalized storage (for example string, number, boolean)." ;
            sh:in ( pbs:performance_property_value_type_string pbs:performance_property_value_type_number pbs:performance_property_value_type_boolean ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 1 ;
            sh:path pbs:property_value_type ],
        [ sh:description "Optional URI that identifies the normalized property unit in an external vocabulary such as QUDT." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:property_unit_uri ],
        [ sh:datatype xsd:boolean ;
            sh:description "Boolean value when property_value_type is boolean." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:property_value_boolean ],
        [ sh:datatype xsd:string ;
            sh:description "Mapping specification version used to derive the normalized property." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:mapping_version ],
        [ sh:datatype xsd:string ;
            sh:description "Original IFC PropertySet name (for example Pset_WallCommon)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:source_pset ],
        [ sh:datatype xsd:string ;
            sh:description "Normalized unit where applicable (for example min, dB, W/m2K)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:property_unit ],
        [ sh:datatype xsd:string ;
            sh:description "String value when property_value_type is string." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:property_value_string ],
        [ sh:datatype xsd:string ;
            sh:description "Raw source value before normalization." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:source_value_raw ] ;
    sh:targetClass pbs:SecurityProperty .

pbs:Separator a sh:NodeShape ;
    rdfs:comment "Abstract base class for elements that separate spaces or zones." ;
    sh:closed false ;
    sh:ignoredProperties ( pbs:separates_levels pbs:separates_spaces pbs:separator_slab_type pbs:separator_wall_type rdf:type ) ;
    sh:property [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:classifications ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 16 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:LevelContext ;
            sh:description "Parent level/storey context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:parent_level ],
        [ sh:description """Performance requirement drivers for this separator. Multiple values are allowed because one separator may need to satisfy several requirements.
""" ;
            sh:in ( pbs:requirement_driver_acoustic pbs:requirement_driver_fire pbs:requirement_driver_thermal pbs:requirement_driver_privacy pbs:requirement_driver_hygiene pbs:requirement_driver_structural ) ;
            sh:order 0 ;
            sh:path pbs:separator_requirement_drivers ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 20 ;
            sh:path pbs:status ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "physical" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:content_kind ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 6 ;
            sh:path pbs:localized_names ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 9 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:revision ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 17 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:metadata ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:meaning_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:description ],
        [ sh:class pbs:BuiltAssetContext ;
            sh:description "Parent building context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path pbs:parent_building ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:geometry_representations ] ;
    sh:targetClass pbs:Separator .

pbs:SeparatorSlab a sh:NodeShape ;
    rdfs:comment "Slab-based separating element (for example floor/roof/base slab separators)." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 18 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:created_at ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "physical" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:content_kind ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:classifications ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:BuiltAssetContext ;
            sh:description "Parent building context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:parent_building ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:quantity_values ],
        [ sh:description """Performance requirement drivers for this separator. Multiple values are allowed because one separator may need to satisfy several requirements.
""" ;
            sh:in ( pbs:requirement_driver_acoustic pbs:requirement_driver_fire pbs:requirement_driver_thermal pbs:requirement_driver_privacy pbs:requirement_driver_hygiene pbs:requirement_driver_structural ) ;
            sh:order 2 ;
            sh:path pbs:separator_requirement_drivers ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:name ],
        [ sh:class pbs:LevelContext ;
            sh:description "Level context nodes separated by this slab separator." ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path pbs:separates_levels ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 20 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 21 ;
            sh:path pbs:revision ],
        [ sh:class pbs:LevelContext ;
            sh:description "Parent level/storey context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:parent_level ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 22 ;
            sh:path pbs:status ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 8 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:performance_properties ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:meaning_uri ],
        [ sh:description "Classification of slab-based separator element (for example floor/roof/base slab)." ;
            sh:in ( ifcowl:IfcSlabTypeEnum.FLOOR ifcowl:IfcSlabTypeEnum.ROOF ifcowl:IfcSlabTypeEnum.BASESLAB ifcowl:IfcSlabTypeEnum.FLOOR ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:separator_slab_type ] ;
    sh:targetClass pbs:SeparatorSlab .

pbs:SeparatorWall a sh:NodeShape ;
    rdfs:comment "Wall-based separating element." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:description """Performance requirement drivers for this separator. Multiple values are allowed because one separator may need to satisfy several requirements.
""" ;
            sh:in ( pbs:requirement_driver_acoustic pbs:requirement_driver_fire pbs:requirement_driver_thermal pbs:requirement_driver_privacy pbs:requirement_driver_hygiene pbs:requirement_driver_structural ) ;
            sh:order 2 ;
            sh:path pbs:separator_requirement_drivers ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 21 ;
            sh:path pbs:revision ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:Space ;
            sh:description "Spaces separated by this separator element." ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path pbs:separates_spaces ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:description ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:quantity_values ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:classifications ],
        [ sh:description "Classification of wall-based separator element." ;
            sh:in ( ifcowl:IfcWall ifcowl:IfcWall ifcowl:IfcWall ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:separator_wall_type ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 8 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:BuiltAssetContext ;
            sh:description "Parent building context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:parent_building ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:LevelContext ;
            sh:description "Parent level/storey context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:parent_level ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 20 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 18 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:created_at ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:id ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:meaning_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "physical" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:content_kind ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 22 ;
            sh:path pbs:status ] ;
    sh:targetClass pbs:SeparatorWall .

pbs:SoftwareAgent a sh:NodeShape ;
    rdfs:comment "Automated actor (integration, bot, or pipeline) acting in workflow roles." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "agent" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:content_kind ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 20 ;
            sh:path pbs:status ],
        [ sh:class pbs:Company ;
            sh:description "Organization accountable for this software agent." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 0 ;
            sh:path pbs:operated_by ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:revision ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 6 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:id ],
        [ sh:description "Optional URI of the running service or integration endpoint." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:service_endpoint ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 16 ;
            sh:path pbs:applies_to_entities ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:string ;
            sh:description "Optional deployed version label for the software agent." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:software_version ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:name ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 9 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 17 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:performance_properties ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ] ;
    sh:targetClass pbs:SoftwareAgent .

pbs:SpatialContext a sh:NodeShape ;
    rdfs:comment "Context node used to represent perimeter, legal site, built asset, level, or zone." ;
    sh:closed true ;
    sh:ignoredProperties ( pbs:elevation pbs:elevation_unit rdf:type ) ;
    sh:property [ sh:class pbs:PerimeterContext ;
            sh:description "Parent perimeter context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:parent_perimeter ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 22 ;
            sh:path pbs:quantity_values ],
        [ sh:class pbs:LegalSiteContext ;
            sh:description "Parent legal site context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:parent_legal_site ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:id ],
        [ sh:class pbs:BuiltAssetContext ;
            sh:description "Parent building context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:parent_building ],
        [ sh:class pbs:LevelContext ;
            sh:description "Parent level/storey context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:parent_level ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "context" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 13 ;
            sh:path pbs:content_kind ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 29 ;
            sh:path pbs:status ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 28 ;
            sh:path pbs:revision ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 25 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:Entity ;
            sh:description "Zone members; may include spaces, separations, systems, etc." ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:group_members ],
        [ sh:class pbs:Material ;
            sh:description "Material definitions associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 11 ;
            sh:path pbs:materials ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 27 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:Project ;
            sh:description "Parent project reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:parent_project ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 26 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 24 ;
            sh:path pbs:performance_properties ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 23 ;
            sh:path pbs:metadata ],
        [ sh:description "Classification of context entity (perimeter, legal_site, building, civil_structure, level, zone)." ;
            sh:in ( ifcowl:IfcSite pbs:LegalSiteContext bot:Building ifcowl:IfcCivilElement bot:Storey bot:Zone ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:context_type ],
        [ sh:description "Optional zone classification; intended for SpatialContext nodes where context_type is zone." ;
            sh:in ( ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ifcowl:IfcGroup ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ) ;
            sh:maxCount 1 ;
            sh:order 1 ;
            sh:path pbs:zone_type ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 17 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 21 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:ZoneContext ;
            sh:description "Parent zone context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:parent_zone ],
        [ sh:class pbs:TimeRecord ;
            sh:description "Time records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:time_records ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 20 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:name ],
        [ sh:class pbs:CostRecord ;
            sh:description "Cost records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:cost_records ] ;
    sh:targetClass pbs:SpatialContext .

pbs:SpatialRequirement a sh:NodeShape ;
    rdfs:comment "Spatial constraint requirement (min area, min height, adjacency, etc.)." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:double ;
            sh:description "Minimum required height or clear height in metres." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:min_height ],
        [ sh:datatype xsd:double ;
            sh:description "Minimum clear distance in metres when adjacency_kind is min_clear_distance." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:min_clear_distance ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 11 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:geometry_representations ],
        [ sh:description "Adjacency semantics when this spatial requirement involves another subject." ;
            sh:in ( pbs:spatial_adjacency_adjacent_to pbs:spatial_adjacency_not_adjacent_to pbs:spatial_adjacency_min_clear_distance ) ;
            sh:maxCount 1 ;
            sh:order 2 ;
            sh:path pbs:adjacency_kind ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 22 ;
            sh:path pbs:revision ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 19 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 21 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:Artifact ;
            sh:description "Optional source artifact backing this requirement." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:source_artifact ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:double ;
            sh:description "Minimum required area in square metres." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:min_area ],
        [ sh:class pbs:Entity ;
            sh:description "Entity or space subject for adjacency or distance constraints." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:related_entity ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 20 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:metadata ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 13 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "requirement" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:name ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 23 ;
            sh:path pbs:status ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 9 ;
            sh:path pbs:localized_names ] ;
    sh:targetClass pbs:SpatialRequirement .

pbs:StructuralProperty a sh:NodeShape ;
    rdfs:comment "Normalized structural-related property." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "Original IFC PropertySet name (for example Pset_WallCommon)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:source_pset ],
        [ sh:description "Value type discriminator for normalized storage (for example string, number, boolean)." ;
            sh:in ( pbs:performance_property_value_type_string pbs:performance_property_value_type_number pbs:performance_property_value_type_boolean ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 1 ;
            sh:path pbs:property_value_type ],
        [ sh:description "Optional URI that identifies the normalized property unit in an external vocabulary such as QUDT." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:property_unit_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Normalized unit where applicable (for example min, dB, W/m2K)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:property_unit ],
        [ sh:datatype xsd:double ;
            sh:description "Numeric value when property_value_type is number." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:property_value_number ],
        [ sh:description "Canonical key inside the domain; constrained via subclass slot_usage to a domain-specific enum." ;
            sh:in ( pbs:structural_property_load_bearing pbs:structural_property_stiffness_class pbs:structural_property_strength_class ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:property_key ],
        [ sh:datatype xsd:string ;
            sh:description "Mapping specification version used to derive the normalized property." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:mapping_version ],
        [ sh:datatype xsd:string ;
            sh:description "Original property name inside the source PropertySet (for example FireRating)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:source_property ],
        [ sh:datatype xsd:boolean ;
            sh:description "Boolean value when property_value_type is boolean." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:property_value_boolean ],
        [ sh:datatype xsd:string ;
            sh:description "String value when property_value_type is string." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:property_value_string ],
        [ sh:datatype xsd:string ;
            sh:description "Raw source value before normalization." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:source_value_raw ] ;
    sh:targetClass pbs:StructuralProperty .

pbs:ThermalProperty a sh:NodeShape ;
    rdfs:comment "Normalized thermal-related property." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "Mapping specification version used to derive the normalized property." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:mapping_version ],
        [ sh:datatype xsd:string ;
            sh:description "String value when property_value_type is string." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:property_value_string ],
        [ sh:description "Value type discriminator for normalized storage (for example string, number, boolean)." ;
            sh:in ( pbs:performance_property_value_type_string pbs:performance_property_value_type_number pbs:performance_property_value_type_boolean ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 1 ;
            sh:path pbs:property_value_type ],
        [ sh:datatype xsd:boolean ;
            sh:description "Boolean value when property_value_type is boolean." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:property_value_boolean ],
        [ sh:datatype xsd:string ;
            sh:description "Original property name inside the source PropertySet (for example FireRating)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:source_property ],
        [ sh:datatype xsd:double ;
            sh:description "Numeric value when property_value_type is number." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:property_value_number ],
        [ sh:description "Optional URI that identifies the normalized property unit in an external vocabulary such as QUDT." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:property_unit_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Normalized unit where applicable (for example min, dB, W/m2K)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:property_unit ],
        [ sh:datatype xsd:string ;
            sh:description "Raw source value before normalization." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:source_value_raw ],
        [ sh:description "Canonical key inside the domain; constrained via subclass slot_usage to a domain-specific enum." ;
            sh:in ( pbs:thermal_property_u_value pbs:thermal_property_r_value pbs:thermal_property_thermal_transmittance ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:property_key ],
        [ sh:datatype xsd:string ;
            sh:description "Original IFC PropertySet name (for example Pset_WallCommon)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:source_pset ] ;
    sh:targetClass pbs:ThermalProperty .

pbs:VirtualEntity a sh:NodeShape ;
    rdfs:comment "Abstract base class for non-physical, conceptual, or informational entities." ;
    sh:closed false ;
    sh:ignoredProperties ( pbs:related_product pbs:time_plan pbs:group_members pbs:currency pbs:actual_start_at pbs:material_category pbs:elevation_unit pbs:elevation pbs:connects_physical_elements pbs:zone_type pbs:cost_quantity_unit pbs:component_cost_items pbs:serves_spaces pbs:cost_record_role pbs:priced_for_customer pbs:cost_quantity_value pbs:space_name_type pbs:is_above_ground pbs:parent_legal_site pbs:connection_virtual_type pbs:component_time_items pbs:context_type pbs:is_cooled pbs:cost_category rdf:type pbs:actual_finish_at pbs:is_heated pbs:milestone_at pbs:system_type pbs:material_specification pbs:connection_virtual_requirement_drivers pbs:parent_building pbs:contained_entities pbs:planned_finish_at pbs:unit_cost pbs:parent_project pbs:serves_zones pbs:system_discipline pbs:successors pbs:space_type pbs:cost_quantity_type pbs:connects_spaces pbs:planned_start_at pbs:parent_level pbs:parent_zone pbs:bounded_by pbs:parent_perimeter ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "virtual" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:revision ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:classifications ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 9 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 16 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:TimeRecord ;
            sh:description "Time records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path pbs:time_records ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:id ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 20 ;
            sh:path pbs:status ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:description ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:Material ;
            sh:description "Material definitions associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:materials ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 17 ;
            sh:path pbs:created_at ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:name ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 6 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:CostRecord ;
            sh:description "Cost records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 0 ;
            sh:path pbs:cost_records ] ;
    sh:targetClass pbs:VirtualEntity .

pbs:ConsentRecord a sh:NodeShape ;
    rdfs:comment "Record of lawful basis, scope, and lifecycle for processing personal data on a Person." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:description "Personal data categories covered by this consent or processing record." ;
            sh:in ( pbs:personal_data_category_identity pbs:personal_data_category_contact pbs:personal_data_category_address pbs:personal_data_category_affiliation ) ;
            sh:minCount 1 ;
            sh:order 2 ;
            sh:path pbs:data_categories ],
        [ sh:datatype xsd:string ;
            sh:description "Optional notes about how or where consent was captured." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:consent_notes ],
        [ sh:datatype xsd:string ;
            sh:description "Human-readable purpose for which the personal data categories are processed." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:processing_purpose ],
        [ sh:description "Lawful basis for processing the scoped personal data categories." ;
            sh:in ( pbs:lawful_basis_consent pbs:lawful_basis_contract pbs:lawful_basis_legal_obligation pbs:lawful_basis_vital_interest pbs:lawful_basis_public_task pbs:lawful_basis_legitimate_interest ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:lawful_basis ],
        [ sh:description "URI of the current or default privacy policy or notice applicable to this person record." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:privacy_policy_uri ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Timestamp when consent was given. Required when lawful_basis is consent." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:granted_at ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Timestamp when consent was withdrawn, if applicable." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:withdrawn_at ] ;
    sh:targetClass pbs:ConsentRecord .

pbs:Decision a sh:NodeShape ;
    rdfs:comment """Decision entity for workflow traceability and governance. Entity.status covers lifecycle; decision_status uses workflow vocabulary URIs.
""" ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:id ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:description "Decision status expressed as a URI/CURIE (for example proposed, accepted, rejected, superseded)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path <http://www.w3.org/ns/adms#status> ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:classifications ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:name ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 8 ;
            sh:path pbs:localized_names ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 22 ;
            sh:path pbs:status ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:performance_properties ],
        [ sh:datatype xsd:string ;
            sh:description "Human-readable rationale that explains why the decision was made." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path dcterms:description ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "decision" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 20 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:Agent ;
            sh:description "Agent responsible for the decision." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path prov:wasAttributedTo ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 21 ;
            sh:path pbs:revision ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Timestamp when the decision was made." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path dcterms:created ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:meaning_uri ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:created_at ],
        [ sh:description "Decision type expressed as a URI/CURIE from a controlled vocabulary." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 0 ;
            sh:path dcterms:type ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:description ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 18 ;
            sh:path pbs:applies_to_entities ] ;
    sh:targetClass pbs:Decision .

pbs:Person a sh:NodeShape ;
    rdfs:comment """Individual stakeholder, contributor, assignee, or responsible party represented in the schema. Instances may contain personal data; privacy slots govern lawful processing, consent, retention, and redaction.
""" ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:description "Privacy handling state for personal data on this person, orthogonal to workflow QA status." ;
            sh:in ( pbs:personal_data_processing_state_active pbs:personal_data_processing_state_redacted pbs:personal_data_processing_state_pseudonymized pbs:personal_data_processing_state_anonymized pbs:personal_data_processing_state_erasure_pending pbs:personal_data_processing_state_erased ) ;
            sh:maxCount 1 ;
            sh:order 5 ;
            sh:path pbs:personal_data_processing_state ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Storage-limit deadline after which personal data should be deleted or redacted." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:retain_until ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 29 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:PostalAddress ;
            sh:description "Structured postal or physical addresses associated with this agent." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 0 ;
            sh:path pbs:postal_addresses ],
        [ sh:class pbs:ContactPoint ;
            sh:description "Structured communication channels and profiles associated with this agent." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 1 ;
            sh:path pbs:contact_points ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 31 ;
            sh:path pbs:status ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 22 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 30 ;
            sh:path pbs:revision ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 27 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:Company ;
            sh:description "Optional company that the person belongs to." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:belongs_to_company ],
        [ sh:datatype xsd:date ;
            sh:description "Date of birth. Personal data; governed by personal_data_processing_state, consent_records, and retain_until." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path schema:birthDate ],
        [ sh:description "Whether the person is active, retired, or deceased. Orthogonal to privacy processing state and workflow QA status." ;
            sh:in ( pbs:person_lifecycle_status_active pbs:person_lifecycle_status_retired pbs:person_lifecycle_status_deceased ) ;
            sh:maxCount 1 ;
            sh:order 4 ;
            sh:path pbs:lifecycle_status ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:id ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 26 ;
            sh:path pbs:performance_properties ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 19 ;
            sh:path pbs:meaning_uri ],
        [ sh:datatype xsd:string ;
            sh:description "High-level purposes for processing personal data (for example project coordination, contract administration)." ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:processing_purposes ],
        [ sh:class pbs:Company ;
            sh:description "Organization accountable as data controller for this person record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:data_controller ],
        [ sh:description "URI of the current or default privacy policy or notice applicable to this person record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:privacy_policy_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "agent" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 15 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Timestamp when identifying personal data was redacted on this record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 11 ;
            sh:path pbs:redacted_at ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 28 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 24 ;
            sh:path pbs:quantity_values ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:PersonRelationship ;
            sh:description """Typed social, professional, commercial, and interest relationships to other agents or topic concepts. May be populated manually or extracted from CRM stories via LLM; use relationship_source for provenance (for example a Message id). May constitute personal data; governed by personal_data_processing_state, consent_records, retain_until, and related privacy slots on this Person.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:person_relationships ],
        [ sh:datatype xsd:string ;
            sh:description "Reason for redaction (for example external model export, erasure request, retention expired)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:redaction_reason ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 20 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 21 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:name ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 23 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:ConsentRecord ;
            sh:description """Audit trail of lawful basis and consent for processing personal data. When lawful_basis is consent and state is active, at least one non-withdrawn record should be present.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 6 ;
            sh:path pbs:consent_records ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 25 ;
            sh:path pbs:metadata ] ;
    sh:targetClass pbs:Person .

pbs:PersonRelationship a sh:NodeShape ;
    rdfs:comment """Typed link from a person to another agent or to a topic concept. The predicate is expressed as a Classification referencing AbstractPersonRelationshipType. Exactly one of related_person, related_company, or related_topic must be set; see the target-kind mapping for predicate-to-slot rules.
""" ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:Company ;
            sh:description "Target organization for org and commercial predicates such as works_at, worked_at, is_key_account_manager_for, client_of, or vendor_of." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:related_company ],
        [ sh:class pbs:Classification ;
            sh:description """Relationship predicate. classification_scheme must be AbstractPersonRelationshipType; classification_code and classification_uri reference the SKOS concept.
""" ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 0 ;
            sh:path pbs:relationship_type ],
        [ sh:class pbs:Classification ;
            sh:description """Topic of interest. classification_scheme must be AbstractTopicClassification; classification_uri references the SKOS topic concept.
""" ;
            sh:maxCount 1 ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 3 ;
            sh:path pbs:related_topic ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Optional start of the relationship period (for example employment start for worked_at)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:valid_from ],
        [ sh:class pbs:Person ;
            sh:description "Target person for social and professional predicates such as knows, was_colleague_of, reports_to, or has_key_account_manager." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path pbs:related_person ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Optional end of the relationship period (for example employment end for worked_at)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:valid_to ],
        [ sh:datatype xsd:string ;
            sh:description "Optional free-text context for this relationship record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:relationship_notes ],
        [ sh:datatype xsd:string ;
            sh:description "Optional provenance label (for example manual, crm:manual, llm:story-msg-0042, LinkedIn)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:relationship_source ] ;
    sh:targetClass pbs:PersonRelationship .

pbs:Program a sh:NodeShape ;
    rdfs:comment "Portfolio or capital program scope grouping related projects." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 17 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:description ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 15 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:string ;
            sh:description "External or internal program identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:program_code ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "program" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:content_kind ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 10 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 5 ;
            sh:path pbs:localized_names ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:revision ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:id ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:metadata ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 19 ;
            sh:path pbs:status ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:Company ;
            sh:description "Owning client organization." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path pbs:client ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 8 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:quantity_values ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:performance_properties ] ;
    sh:targetClass pbs:Program .

pbs:System a sh:NodeShape ;
    rdfs:comment "Building service system grouping that serves spaces or zones." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "virtual" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 11 ;
            sh:path pbs:content_kind ],
        [ sh:description "Classification of system role (unit, network, terminal)." ;
            sh:in ( ifcowl:IfcUnitaryEquipment ifcowl:IfcDistributionFlowElement ifcowl:IfcFlowTerminal ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:system_type ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 17 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 24 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:Space ;
            sh:description "Spaces served by this system." ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:serves_spaces ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 23 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:ZoneContext ;
            sh:description "Zone context nodes served by this system." ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:serves_zones ],
        [ sh:class pbs:Material ;
            sh:description "Material definitions associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:materials ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:classifications ],
        [ sh:description "Classification of system discipline (electrical, sanitary, ventilation, heating)." ;
            sh:in ( ifcowl:IfcDistributionSystemEnum.ELECTRICAL ifcowl:IfcDistributionSystemEnum.PLUMBING ifcowl:IfcDistributionSystemEnum.VENTILATION ifcowl:IfcDistributionSystemEnum.HEATING ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 1 ;
            sh:path pbs:system_discipline ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 21 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 19 ;
            sh:path pbs:geometry_representations ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 27 ;
            sh:path pbs:status ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:description ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 20 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 25 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 22 ;
            sh:path pbs:performance_properties ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 15 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:localized_names ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 26 ;
            sh:path pbs:revision ],
        [ sh:class pbs:BuiltAssetContext ;
            sh:description "Parent building context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:parent_building ],
        [ sh:class pbs:Entity ;
            sh:description "Generic containment for associated entities." ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:contained_entities ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:id ],
        [ sh:class pbs:Project ;
            sh:description "Parent project reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:parent_project ],
        [ sh:class pbs:TimeRecord ;
            sh:description "Time records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:time_records ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:name ],
        [ sh:class pbs:CostRecord ;
            sh:description "Cost records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:cost_records ] ;
    sh:targetClass pbs:System .

pbs:TimeLink a sh:NodeShape ;
    rdfs:comment "Inline typed precedence link from a TimeRecord to one successor. Not a VirtualEntity — no id, no mixin. Owned by the predecessor record." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:TimeRecord ;
            sh:description "The successor TimeRecord." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 0 ;
            sh:path pbs:target_item ],
        [ sh:datatype xsd:integer ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:lag_days ],
        [ sh:defaultValue "FS" ;
            sh:description "FS | SS | FF | SF" ;
            sh:in ( pbs:dependency_type_finish_to_start pbs:dependency_type_start_to_start pbs:dependency_type_finish_to_finish pbs:dependency_type_start_to_finish ) ;
            sh:maxCount 1 ;
            sh:order 1 ;
            sh:path pbs:dependency_type ] ;
    sh:targetClass pbs:TimeLink .

pbs:ContactPoint a sh:NodeShape ;
    rdfs:comment "Structured communication endpoint or profile for an agent." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "Communication channel type such as email, phone, website, linkedin, whatsapp, signal, slack, teams, or telegram." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:contact_channel_type ],
        [ sh:datatype xsd:string ;
            sh:description "Optional notes about availability, office hours, or response expectations." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:availability_notes ],
        [ sh:datatype xsd:boolean ;
            sh:description "Indicates whether this is the preferred contact point." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:is_preferred ],
        [ sh:datatype xsd:string ;
            sh:description "Optional usage context such as work, personal, support, billing, or emergency." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:usage_context ],
        [ sh:datatype xsd:string ;
            sh:description "Human-readable contact value such as an email address, phone number, handle, or username." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:contact_value ],
        [ sh:description "URI for the contact endpoint or profile where applicable." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:contact_uri ] ;
    sh:targetClass pbs:ContactPoint .

pbs:PhysicalElement a sh:NodeShape ;
    rdfs:comment "Base class for physical elements that can be placed in built asset/level context." ;
    sh:closed false ;
    sh:ignoredProperties ( pbs:bounded_space pbs:boundary_type pbs:separator_requirement_drivers pbs:separator_wall_type pbs:separates_levels pbs:equipment_type pbs:connection_functional_types pbs:separates_spaces rdf:type pbs:infill_material pbs:transport_medium pbs:parent_space pbs:parent_system pbs:frame_material pbs:separator_slab_type pbs:connection_physical_type pbs:connection_physical_requirement_drivers ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:name ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 10 ;
            sh:path pbs:classifications ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 15 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "physical" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 17 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:LevelContext ;
            sh:description "Parent level/storey context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path pbs:parent_level ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 19 ;
            sh:path pbs:status ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:description ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 8 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:BuiltAssetContext ;
            sh:description "Parent building context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 0 ;
            sh:path pbs:parent_building ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:revision ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 5 ;
            sh:path pbs:localized_names ] ;
    sh:targetClass pbs:PhysicalElement .

pbs:PostalAddress a sh:NodeShape ;
    rdfs:comment "Structured postal or physical address for an agent." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "Postal or ZIP code." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path schema:postalCode ],
        [ sh:datatype xsd:string ;
            sh:description "Optional ISO 3166-1 alpha-2 or alpha-3 country code." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:address_country_code ],
        [ sh:datatype xsd:string ;
            sh:description "Country name." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path schema:addressCountry ],
        [ sh:datatype xsd:string ;
            sh:description "Post office box number where applicable." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path schema:postOfficeBoxNumber ],
        [ sh:datatype xsd:string ;
            sh:description "Locality, city, or town." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path schema:addressLocality ],
        [ sh:datatype xsd:string ;
            sh:description "Street name and house number or equivalent address line." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path schema:streetAddress ],
        [ sh:datatype xsd:string ;
            sh:description "Region, state, canton, or province." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path schema:addressRegion ] ;
    sh:targetClass pbs:PostalAddress .

pbs:Product a sh:NodeShape ;
    rdfs:comment "Commercial product or service offering sold by a company." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 6 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 9 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:Company ;
            sh:description "Company that sells or offers this product." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path pbs:vendor ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:revision ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 16 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:quantity_values ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 20 ;
            sh:path pbs:status ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:string ;
            sh:description "External or internal product catalog identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:product_code ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "product" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:content_kind ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:CostRecord ;
            sh:description "Catalog cost and price records for this product (cost_record_role cost or price)." ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:catalog_cost_records ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:metadata ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 17 ;
            sh:path pbs:created_at ] ;
    sh:targetClass pbs:Product .

pbs:Requirement a sh:NodeShape ;
    rdfs:comment """Prescriptive requirement entity (content_kind requirement). Applies to model entities via applies_to_entities. Domain is discriminated by concrete subclass (PerformanceRequirement, SpatialRequirement, DeliverableRequirement, etc.), not a separate slot.
""" ;
    sh:closed false ;
    sh:ignoredProperties ( pbs:target_value_string pbs:currency pbs:requirement_property_key pbs:substitutes_allowed pbs:material_category pbs:acceptance_criteria pbs:deliverable_format pbs:norm_uri pbs:min_area pbs:related_time_record pbs:min_clear_distance pbs:adjacency_kind pbs:target_unit_uri pbs:target_value_number pbs:related_entity pbs:cost_category rdf:type pbs:programme_ref pbs:material_specification pbs:earliest_start_at pbs:target_operator pbs:jurisdiction pbs:target_value_boolean pbs:cost_quantity_type pbs:deliverable_kind pbs:statement pbs:target_unit pbs:clause_ref pbs:related_material pbs:min_height schema:deadline ) ;
    sh:property [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 7 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "requirement" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:content_kind ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 14 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:name ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 18 ;
            sh:path pbs:status ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 9 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 17 ;
            sh:path pbs:revision ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 15 ;
            sh:path pbs:created_at ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 4 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:id ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 10 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:description ],
        [ sh:class pbs:Artifact ;
            sh:description "Optional source artifact backing this requirement." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 0 ;
            sh:path pbs:source_artifact ] ;
    sh:targetClass pbs:Requirement .

pbs:Space a sh:NodeShape ;
    rdfs:comment "Spatial container used for occupancy, circulation, service, or analysis." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:description "Classification of space (void, circulation, usable, service)." ;
            sh:in ( ifcowl:IfcSpace ifcowl:IfcSpace ifcowl:IfcSpace ifcowl:IfcSpace ifcowl:IfcSpace ifcowl:IfcSpace ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:space_type ],
        [ sh:class pbs:TimeRecord ;
            sh:description "Time records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 11 ;
            sh:path pbs:time_records ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 23 ;
            sh:path pbs:quantity_values ],
        [ sh:description "Normalized abstract room name type (for example office, kitchen, corridor). Project-specific labels remain on name. When set, adapters may derive a BuildingSpaceActivityClassification entry in classifications[] via the room-name-to-activity mapping bridge." ;
            sh:in ( <https://example.org/abstract/building-space-name-classification/RN_RES_BED> <https://example.org/abstract/building-space-name-classification/RN_RES_LIV> <https://example.org/abstract/building-space-name-classification/RN_RES_DIN> <https://example.org/abstract/building-space-name-classification/RN_RES_STU> <https://example.org/abstract/building-space-name-classification/RN_RES_GST> <https://example.org/abstract/building-space-name-classification/RN_RES_KIT> <https://example.org/abstract/building-space-name-classification/RN_RES_BTH> <https://example.org/abstract/building-space-name-classification/RN_RES_LAU> <https://example.org/abstract/building-space-name-classification/RN_RES_UTL> <https://example.org/abstract/building-space-name-classification/RN_RES_ENT> <https://example.org/abstract/building-space-name-classification/RN_RES_CLO> <https://example.org/abstract/building-space-name-classification/RN_RES_APT> <https://example.org/abstract/building-space-name-classification/RN_WRK_OFF> <https://example.org/abstract/building-space-name-classification/RN_WRK_OPN> <https://example.org/abstract/building-space-name-classification/RN_WRK_MTG> <https://example.org/abstract/building-space-name-classification/RN_WRK_CNF> <https://example.org/abstract/building-space-name-classification/RN_WRK_BRK> <https://example.org/abstract/building-space-name-classification/RN_WRK_REC> <https://example.org/abstract/building-space-name-classification/RN_CIR_COR> <https://example.org/abstract/building-space-name-classification/RN_CIR_LOB> <https://example.org/abstract/building-space-name-classification/RN_CIR_ENT> <https://example.org/abstract/building-space-name-classification/RN_CIR_VES> <https://example.org/abstract/building-space-name-classification/RN_CIR_STR> <https://example.org/abstract/building-space-name-classification/RN_CIR_ELV> <https://example.org/abstract/building-space-name-classification/RN_CIR_RAM> <https://example.org/abstract/building-space-name-classification/RN_HYG_WC_M> <https://example.org/abstract/building-space-name-classification/RN_HYG_WC_F> <https://example.org/abstract/building-space-name-classification/RN_HYG_WC_IV> <https://example.org/abstract/building-space-name-classification/RN_HYG_WC_MIX> <https://example.org/abstract/building-space-name-classification/RN_HYG_SHW> <https://example.org/abstract/building-space-name-classification/RN_HYG_CHG> <https://example.org/abstract/building-space-name-classification/RN_HYG_LCK> <https://example.org/abstract/building-space-name-classification/RN_HLC_PAT> <https://example.org/abstract/building-space-name-classification/RN_HLC_RCV> <https://example.org/abstract/building-space-name-classification/RN_HLC_TRT> <https://example.org/abstract/building-space-name-classification/RN_HLC_OR> <https://example.org/abstract/building-space-name-classification/RN_HLC_PRM> <https://example.org/abstract/building-space-name-classification/RN_HLC_EXM> <https://example.org/abstract/building-space-name-classification/RN_HLC_IMG> <https://example.org/abstract/building-space-name-classification/RN_HLC_LAB> <https://example.org/abstract/building-space-name-classification/RN_HLC_WTR> <https://example.org/abstract/building-space-name-classification/RN_HLC_NRS> <https://example.org/abstract/building-space-name-classification/RN_LRN_CLS> <https://example.org/abstract/building-space-name-classification/RN_LRN_LCT> <https://example.org/abstract/building-space-name-classification/RN_LRN_SEM> <https://example.org/abstract/building-space-name-classification/RN_LRN_CMP> <https://example.org/abstract/building-space-name-classification/RN_LRN_LIB> <https://example.org/abstract/building-space-name-classification/RN_LRN_STU> <https://example.org/abstract/building-space-name-classification/RN_LRN_WRK> <https://example.org/abstract/building-space-name-classification/RN_LRN_AUS> <https://example.org/abstract/building-space-name-classification/RN_LRN_ART> <https://example.org/abstract/building-space-name-classification/RN_LRN_SCI> <https://example.org/abstract/building-space-name-classification/RN_COM_CAF> <https://example.org/abstract/building-space-name-classification/RN_COM_RST> <https://example.org/abstract/building-space-name-classification/RN_COM_BAR> <https://example.org/abstract/building-space-name-classification/RN_COM_FOD> <https://example.org/abstract/building-space-name-classification/RN_COM_RET> <https://example.org/abstract/building-space-name-classification/RN_COM_SAL> <https://example.org/abstract/building-space-name-classification/RN_COM_KSK> <https://example.org/abstract/building-space-name-classification/RN_COM_CUS> <https://example.org/abstract/building-space-name-classification/RN_COM_EXH> <https://example.org/abstract/building-space-name-classification/RN_COM_HTL> <https://example.org/abstract/building-space-name-classification/RN_IND_WRK> <https://example.org/abstract/building-space-name-classification/RN_IND_PRD> <https://example.org/abstract/building-space-name-classification/RN_IND_ASM> <https://example.org/abstract/building-space-name-classification/RN_IND_PKG> <https://example.org/abstract/building-space-name-classification/RN_IND_CLN> <https://example.org/abstract/building-space-name-classification/RN_IND_WHS> <https://example.org/abstract/building-space-name-classification/RN_IND_LDK> <https://example.org/abstract/building-space-name-classification/RN_IND_QC> <https://example.org/abstract/building-space-name-classification/RN_IND_MNT> <https://example.org/abstract/building-space-name-classification/RN_IND_YRD> <https://example.org/abstract/building-space-name-classification/RN_TEC_HVC> <https://example.org/abstract/building-space-name-classification/RN_TEC_PMP> <https://example.org/abstract/building-space-name-classification/RN_TEC_BOI> <https://example.org/abstract/building-space-name-classification/RN_TEC_CHL> <https://example.org/abstract/building-space-name-classification/RN_TEC_SPR> <https://example.org/abstract/building-space-name-classification/RN_TEC_ELC> <https://example.org/abstract/building-space-name-classification/RN_TEC_SRV> <https://example.org/abstract/building-space-name-classification/RN_TEC_GEN> <https://example.org/abstract/building-space-name-classification/RN_TEC_TRA> <https://example.org/abstract/building-space-name-classification/RN_TEC_COM> <https://example.org/abstract/building-space-name-classification/RN_TEC_MMR> <https://example.org/abstract/building-space-name-classification/RN_TEC_WST> <https://example.org/abstract/building-space-name-classification/RN_STO_GEN> <https://example.org/abstract/building-space-name-classification/RN_STO_SUP> <https://example.org/abstract/building-space-name-classification/RN_STO_EQP> <https://example.org/abstract/building-space-name-classification/RN_STO_ULD> <https://example.org/abstract/building-space-name-classification/RN_STO_JAN> <https://example.org/abstract/building-space-name-classification/RN_STO_ARC> <https://example.org/abstract/building-space-name-classification/RN_STO_MAL> <https://example.org/abstract/building-space-name-classification/RN_STO_COL> <https://example.org/abstract/building-space-name-classification/RN_OUT_BLN> <https://example.org/abstract/building-space-name-classification/RN_OUT_TRR> <https://example.org/abstract/building-space-name-classification/RN_OUT_PAT> <https://example.org/abstract/building-space-name-classification/RN_OUT_GDN> <https://example.org/abstract/building-space-name-classification/RN_OUT_PLY> <https://example.org/abstract/building-space-name-classification/RN_OUT_SPL> <https://example.org/abstract/building-space-name-classification/RN_OUT_CWK> <https://example.org/abstract/building-space-name-classification/RN_OUT_PRT> <https://example.org/abstract/building-space-name-classification/RN_VOI_SHA> <https://example.org/abstract/building-space-name-classification/RN_VOI_RIS> <https://example.org/abstract/building-space-name-classification/RN_VOI_PLN> <https://example.org/abstract/building-space-name-classification/RN_VOI_MCH> <https://example.org/abstract/building-space-name-classification/RN_VOI_AIR> <https://example.org/abstract/building-space-name-classification/RN_VOI_ATR> <https://example.org/abstract/building-space-name-classification/RN_VOI_PRK> ) ;
            sh:maxCount 1 ;
            sh:order 1 ;
            sh:path pbs:space_name_type ],
        [ sh:class pbs:Material ;
            sh:description "Material definitions associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 12 ;
            sh:path pbs:materials ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 13 ;
            sh:path pbs:id ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 21 ;
            sh:path pbs:classifications ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 19 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 20 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 15 ;
            sh:path pbs:name ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 26 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 25 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:localized_names ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 18 ;
            sh:path pbs:meaning_uri ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 29 ;
            sh:path pbs:revision ],
        [ sh:class pbs:Entity ;
            sh:description "Generic containment for associated entities." ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:contained_entities ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 22 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "virtual" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 27 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:CostRecord ;
            sh:description "Cost records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:cost_records ],
        [ sh:class pbs:PhysicalElement ;
            sh:description "Physical elements that bound a space." ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:bounded_by ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 30 ;
            sh:path pbs:status ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 28 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:boolean ;
            sh:description "Whether the space is designed to receive cooling (air conditioning)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:is_cooled ],
        [ sh:class pbs:ZoneContext ;
            sh:description "Parent zone context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:parent_zone ],
        [ sh:datatype xsd:boolean ;
            sh:description "Whether the space is above ground level. When unset, consumers may derive from parent_level elevation relative to project datum." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:is_above_ground ],
        [ sh:class pbs:LevelContext ;
            sh:description "Parent level/storey context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:parent_level ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 17 ;
            sh:path pbs:description ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 24 ;
            sh:path pbs:metadata ],
        [ sh:datatype xsd:boolean ;
            sh:description "Whether the space is designed to receive heating." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:is_heated ],
        [ sh:class pbs:BuiltAssetContext ;
            sh:description "Parent building context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:parent_building ] ;
    sh:targetClass pbs:Space .

pbs:Agent a sh:NodeShape ;
    rdfs:comment "Abstract base class for human and software actors in workflow and communication roles." ;
    sh:closed false ;
    sh:ignoredProperties ( pbs:service_endpoint pbs:belongs_to_company pbs:software_version pbs:processing_purposes pbs:operated_by pbs:person_relationships pbs:redaction_reason pbs:data_controller pbs:consent_records pbs:personal_data_processing_state pbs:redacted_at rdf:type pbs:retain_until pbs:privacy_policy_uri pbs:lifecycle_status pbs:postal_addresses schema:birthDate pbs:contact_points ) ;
    sh:property [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 6 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:metadata ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:name ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 9 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:revision ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 17 ;
            sh:path pbs:status ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 8 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 3 ;
            sh:path pbs:localized_names ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 15 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "agent" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:content_kind ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 13 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 10 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ] ;
    sh:targetClass pbs:Agent .

pbs:Task a sh:NodeShape ;
    rdfs:comment """Task entity for implementation and follow-up workflows. Entity.status covers lifecycle; task_status uses action status vocabulary URIs. Links to related entities via applies_to_entities.
""" ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:Agent ;
            sh:description "Responsible agent." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path schema:agent ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:quantity_values ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 12 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:Decision ;
            sh:description "Optional reference to a decision that informs or drives this task." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path prov:used ],
        [ sh:description "Task status URI/CURIE aligned with action status vocabularies." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path schema:actionStatus ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:id ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Due timestamp for task completion." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path schema:deadline ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 19 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:metadata ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 24 ;
            sh:path pbs:status ],
        [ sh:datatype xsd:string ;
            sh:description "Additional notes or implementation details for the task." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path rdfs:comment ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 11 ;
            sh:path pbs:description ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 21 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 10 ;
            sh:path pbs:localized_names ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "task" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 22 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:Process ;
            sh:description "Optional BPMN process instance that owns or spawned this task." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:parent_process ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:name ],
        [ sh:description "Task type expressed as a URI/CURIE from a controlled vocabulary." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 0 ;
            sh:path dcterms:type ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 20 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 23 ;
            sh:path pbs:revision ] ;
    sh:targetClass pbs:Task .

pbs:Company a sh:NodeShape ;
    rdfs:comment "Organization, company, or legal entity participating in the project or asset lifecycle." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 5 ;
            sh:path pbs:localized_names ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 17 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 10 ;
            sh:path pbs:classifications ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 8 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:id ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 19 ;
            sh:path pbs:status ],
        [ sh:class pbs:ContactPoint ;
            sh:description "Structured communication channels and profiles associated with this agent." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 1 ;
            sh:path pbs:contact_points ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "agent" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:metadata ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:created_at ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:revision ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:performance_properties ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:description ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 15 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:name ],
        [ sh:class pbs:PostalAddress ;
            sh:description "Structured postal or physical addresses associated with this agent." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 0 ;
            sh:path pbs:postal_addresses ] ;
    sh:targetClass pbs:Company .

pbs:PerimeterContext a sh:NodeShape ;
    rdfs:comment "Spatial context node constrained to perimeter semantics." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:TimeRecord ;
            sh:description "Time records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:time_records ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 17 ;
            sh:path pbs:meaning_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:id ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 21 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:Project ;
            sh:description "Parent project reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:parent_project ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 25 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:description ],
        [ sh:description "Classification of context entity (perimeter, legal_site, building, civil_structure, level, zone)." ;
            sh:in ( ifcowl:IfcSite pbs:LegalSiteContext bot:Building ifcowl:IfcCivilElement bot:Storey bot:Zone ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:context_type ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 23 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 22 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 26 ;
            sh:path pbs:created_at ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 29 ;
            sh:path pbs:status ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:PerimeterContext ;
            sh:description "Parent perimeter context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:parent_perimeter ],
        [ sh:class pbs:Material ;
            sh:description "Material definitions associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 11 ;
            sh:path pbs:materials ],
        [ sh:class pbs:ZoneContext ;
            sh:description "Parent zone context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:parent_zone ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 28 ;
            sh:path pbs:revision ],
        [ sh:class pbs:BuiltAssetContext ;
            sh:description "Parent building context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:parent_building ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 20 ;
            sh:path pbs:classifications ],
        [ sh:class pbs:CostRecord ;
            sh:description "Cost records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:cost_records ],
        [ sh:class pbs:Entity ;
            sh:description "Zone members; may include spaces, separations, systems, etc." ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:group_members ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 24 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:LegalSiteContext ;
            sh:description "Parent legal site context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:parent_legal_site ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 27 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:name ],
        [ sh:description "Optional zone classification; intended for SpatialContext nodes where context_type is zone." ;
            sh:in ( ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ifcowl:IfcGroup ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ) ;
            sh:maxCount 1 ;
            sh:order 1 ;
            sh:path pbs:zone_type ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "context" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 13 ;
            sh:path pbs:content_kind ],
        [ sh:class pbs:LevelContext ;
            sh:description "Parent level/storey context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:parent_level ] ;
    sh:targetClass pbs:PerimeterContext .

pbs:Process a sh:NodeShape ;
    rdfs:comment """Running BPMN process instance in the project graph. Use process_definition_uri for the BPMN definition key or artifact. When orchestration state lives in an external engine, set external_instance_uri to that system of record.
""" ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:metadata ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "process" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:content_kind ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:id ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 19 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 10 ;
            sh:path pbs:localized_names ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:name ],
        [ sh:class pbs:Agent ;
            sh:description "Agents participating in this BPMN process instance (for example assignees mapped from lane roles)." ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:process_participants ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 11 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Timestamp when the process instance completed or terminated, when applicable." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:completed_at ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:quantity_values ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 20 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 22 ;
            sh:path pbs:modified_at ],
        [ sh:description "URI identifying the BPMN process definition (for example engine definition key or BPMN artifact URI)." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 0 ;
            sh:path pbs:process_definition_uri ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 21 ;
            sh:path pbs:created_at ],
        [ sh:description "URI of the corresponding process instance in an external workflow engine when applicable." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path pbs:external_instance_uri ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Timestamp when the process instance started." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path dcterms:created ],
        [ sh:description "Process instance status expressed as a URI/CURIE (for example active, suspended, completed, terminated)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path <http://www.w3.org/ns/adms#status> ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 24 ;
            sh:path pbs:status ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 23 ;
            sh:path pbs:revision ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 12 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:Project ;
            sh:description "Parent project reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:parent_project ] ;
    sh:targetClass pbs:Process .

pbs:Artifact a sh:NodeShape ;
    rdfs:comment """External project artifact (text document, model, or plan) at storage_link. Used for provenance (Requirement.source_artifact). Not a modeled building element.
""" ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:id ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 20 ;
            sh:path pbs:status ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 0 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:revision ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "artifact" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:content_kind ],
        [ sh:description "Kind of external artifact (text document, model, or plan)." ;
            sh:in ( pbs:artifact_kind_text_document pbs:artifact_kind_model pbs:artifact_kind_plan ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 2 ;
            sh:path pbs:artifact_kind ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 7 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 10 ;
            sh:path pbs:localized_descriptions ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:meaning_uri ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 17 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 16 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:description ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 11 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:metadata ],
        [ sh:datatype xsd:string ;
            sh:description "Encoding or format label (for example IFC4, PDF, DWG)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:media_format ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:name ],
        [ sh:description "URI/URL/path to the stored artifact location." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path pbs:storage_link ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:geometry_representations ] ;
    sh:targetClass pbs:Artifact .

pbs:ZoneContext a sh:NodeShape ;
    rdfs:comment "Spatial context node constrained to zone semantics." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 23 ;
            sh:path pbs:metadata ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:description ],
        [ sh:class pbs:Material ;
            sh:description "Material definitions associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 11 ;
            sh:path pbs:materials ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:name ],
        [ sh:description "Classification of context entity (perimeter, legal_site, building, civil_structure, level, zone)." ;
            sh:in ( ifcowl:IfcSite pbs:LegalSiteContext bot:Building ifcowl:IfcCivilElement bot:Storey bot:Zone ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:context_type ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 26 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:TimeRecord ;
            sh:description "Time records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:time_records ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 27 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 24 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:Entity ;
            sh:description "Zone members; may include spaces, separations, systems, etc." ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:group_members ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 21 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:CostRecord ;
            sh:description "Cost records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:cost_records ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:id ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 29 ;
            sh:path pbs:status ],
        [ sh:class pbs:Project ;
            sh:description "Parent project reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:parent_project ],
        [ sh:class pbs:LegalSiteContext ;
            sh:description "Parent legal site context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:parent_legal_site ],
        [ sh:class pbs:LevelContext ;
            sh:description "Parent level/storey context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:parent_level ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:PerimeterContext ;
            sh:description "Parent perimeter context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:parent_perimeter ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 22 ;
            sh:path pbs:quantity_values ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:localized_names ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "context" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 13 ;
            sh:path pbs:content_kind ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 20 ;
            sh:path pbs:classifications ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 17 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:BuiltAssetContext ;
            sh:description "Parent building context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:parent_building ],
        [ sh:class pbs:ZoneContext ;
            sh:description "Parent zone context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:parent_zone ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 28 ;
            sh:path pbs:revision ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 25 ;
            sh:path pbs:applies_to_entities ],
        [ sh:description "Optional zone classification; intended for SpatialContext nodes where context_type is zone." ;
            sh:in ( ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ifcowl:IfcGroup ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ) ;
            sh:maxCount 1 ;
            sh:order 1 ;
            sh:path pbs:zone_type ] ;
    sh:targetClass pbs:ZoneContext .

pbs:Project a sh:NodeShape ;
    rdfs:comment "Business delivery scope for spatial context, systems, and workflow entities." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:revision ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:description ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 6 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:Program ;
            sh:description "Parent program reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:parent_program ],
        [ sh:datatype xsd:string ;
            sh:description "External or internal project identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:project_code ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 16 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:Company ;
            sh:description "Owning client organization." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 1 ;
            sh:path pbs:client ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 9 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 17 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:classifications ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:performance_properties ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 20 ;
            sh:path pbs:status ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "project" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:content_kind ] ;
    sh:targetClass pbs:Project .

pbs:LegalSiteContext a sh:NodeShape ;
    rdfs:comment "Spatial context node constrained to legal site semantics." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:Project ;
            sh:description "Parent project reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:parent_project ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 25 ;
            sh:path pbs:applies_to_entities ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 20 ;
            sh:path pbs:classifications ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 22 ;
            sh:path pbs:quantity_values ],
        [ sh:class pbs:BuiltAssetContext ;
            sh:description "Parent building context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:parent_building ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 29 ;
            sh:path pbs:status ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:name ],
        [ sh:class pbs:Entity ;
            sh:description "Zone members; may include spaces, separations, systems, etc." ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:group_members ],
        [ sh:class pbs:Material ;
            sh:description "Material definitions associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 11 ;
            sh:path pbs:materials ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 23 ;
            sh:path pbs:metadata ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 27 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:description ],
        [ sh:description "Classification of context entity (perimeter, legal_site, building, civil_structure, level, zone)." ;
            sh:in ( ifcowl:IfcSite pbs:LegalSiteContext bot:Building ifcowl:IfcCivilElement bot:Storey bot:Zone ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:context_type ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 17 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 21 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 24 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:PerimeterContext ;
            sh:description "Parent perimeter context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:parent_perimeter ],
        [ sh:description "Optional zone classification; intended for SpatialContext nodes where context_type is zone." ;
            sh:in ( ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ifcowl:IfcGroup ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ) ;
            sh:maxCount 1 ;
            sh:order 1 ;
            sh:path pbs:zone_type ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "context" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 13 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:ZoneContext ;
            sh:description "Parent zone context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:parent_zone ],
        [ sh:class pbs:LegalSiteContext ;
            sh:description "Parent legal site context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:parent_legal_site ],
        [ sh:class pbs:LevelContext ;
            sh:description "Parent level/storey context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:parent_level ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 26 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:CostRecord ;
            sh:description "Cost records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:cost_records ],
        [ sh:class pbs:TimeRecord ;
            sh:description "Time records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:time_records ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 28 ;
            sh:path pbs:revision ] ;
    sh:targetClass pbs:LegalSiteContext .

pbs:BuiltAssetContext a sh:NodeShape ;
    rdfs:comment "Abstract spatial context for built assets such as buildings and civil structures." ;
    sh:closed false ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:ZoneContext ;
            sh:description "Parent zone context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:parent_zone ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 24 ;
            sh:path pbs:performance_properties ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 26 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:Entity ;
            sh:description "Zone members; may include spaces, separations, systems, etc." ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:group_members ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 20 ;
            sh:path pbs:classifications ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 23 ;
            sh:path pbs:metadata ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:Project ;
            sh:description "Parent project reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:parent_project ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 25 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "context" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 13 ;
            sh:path pbs:content_kind ],
        [ sh:description "Classification of context entity (perimeter, legal_site, building, civil_structure, level, zone)." ;
            sh:in ( ifcowl:IfcSite pbs:LegalSiteContext bot:Building ifcowl:IfcCivilElement bot:Storey bot:Zone ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:context_type ],
        [ sh:class pbs:PerimeterContext ;
            sh:description "Parent perimeter context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:parent_perimeter ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 29 ;
            sh:path pbs:status ],
        [ sh:class pbs:CostRecord ;
            sh:description "Cost records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:cost_records ],
        [ sh:class pbs:BuiltAssetContext ;
            sh:description "Parent building context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:parent_building ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 17 ;
            sh:path pbs:meaning_uri ],
        [ sh:description "Optional zone classification; intended for SpatialContext nodes where context_type is zone." ;
            sh:in ( ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ifcowl:IfcGroup ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ) ;
            sh:maxCount 1 ;
            sh:order 1 ;
            sh:path pbs:zone_type ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:localized_names ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 28 ;
            sh:path pbs:revision ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 27 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:name ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 22 ;
            sh:path pbs:quantity_values ],
        [ sh:class pbs:Material ;
            sh:description "Material definitions associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 11 ;
            sh:path pbs:materials ],
        [ sh:class pbs:LegalSiteContext ;
            sh:description "Parent legal site context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:parent_legal_site ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 21 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:id ],
        [ sh:class pbs:LevelContext ;
            sh:description "Parent level/storey context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:parent_level ],
        [ sh:class pbs:TimeRecord ;
            sh:description "Time records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:time_records ] ;
    sh:targetClass pbs:BuiltAssetContext .

pbs:CostRecord a sh:NodeShape ;
    rdfs:comment "Cost record for estimation, catalog pricing, and calculation. Use cost_record_role to distinguish catalog cost/price (on Product) from project estimate/actual lines. Populate component_cost_items to act as an assembly (aggregated unit price)." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "virtual" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 15 ;
            sh:path pbs:content_kind ],
        [ sh:class pbs:CostRecord ;
            sh:description "Cost records aggregated into this assembly record." ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:component_cost_items ],
        [ sh:description "Role of this cost record (catalog cost, catalog price, project estimate, or actual)." ;
            sh:in ( pbs:cost_record_role_cost pbs:cost_record_role_price pbs:cost_record_role_estimate pbs:cost_record_role_actual ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:cost_record_role ],
        [ sh:class pbs:Product ;
            sh:description "Optional catalog product this deliverable implements or this cost record is priced from." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:related_product ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 25 ;
            sh:path pbs:metadata ],
        [ sh:datatype xsd:string ;
            sh:description "Unit of the cost quantity value." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:cost_quantity_unit ],
        [ sh:datatype xsd:string ;
            sh:description "ISO 4217 currency code (for example EUR, USD)." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:currency ;
            sh:pattern "^[A-Z]{3}$" ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 29 ;
            sh:path pbs:revision ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 28 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 27 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:TimeRecord ;
            sh:description "Time records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 12 ;
            sh:path pbs:time_records ],
        [ sh:datatype xsd:string ;
            sh:description "Cost category label kept intentionally open pending classification-backed modeling." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:cost_category ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:double ;
            sh:description "Unit cost for this cost item." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:unit_cost ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 21 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:id ],
        [ sh:class pbs:Company ;
            sh:description "Optional customer for a customer-specific catalog price when cost_record_role is price." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:priced_for_customer ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 26 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 22 ;
            sh:path pbs:classifications ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 30 ;
            sh:path pbs:status ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 24 ;
            sh:path pbs:quantity_values ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 19 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:localized_names ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:description ],
        [ sh:description "Quantity type used as basis for this cost calculation." ;
            sh:in ( ifcowl:IfcQuantityArea ifcowl:IfcQuantityArea ifcowl:IfcQuantityArea ifcowl:IfcQuantityArea ifcowl:IfcQuantityVolume ifcowl:IfcQuantityVolume ifcowl:IfcQuantityLength ifcowl:IfcQuantityLength ifcowl:IfcQuantityLength ifcowl:IfcQuantityLength pbs:quantity_type_count pbs:quantity_type_ratio ) ;
            sh:maxCount 1 ;
            sh:order 4 ;
            sh:path pbs:cost_quantity_type ],
        [ sh:class pbs:Material ;
            sh:description "Material definitions associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 13 ;
            sh:path pbs:materials ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 20 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:CostRecord ;
            sh:description "Cost records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 11 ;
            sh:path pbs:cost_records ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 23 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:double ;
            sh:description "Quantity magnitude used as basis for this cost calculation." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:cost_quantity_value ] ;
    sh:targetClass pbs:CostRecord .

pbs:LevelContext a sh:NodeShape ;
    rdfs:comment "Spatial context node constrained to level/storey semantics." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:ZoneContext ;
            sh:description "Parent zone context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:parent_zone ],
        [ sh:class pbs:BuiltAssetContext ;
            sh:description "Parent building context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:parent_building ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 28 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 23 ;
            sh:path pbs:geometry_representations ],
        [ sh:description "Classification of context entity (perimeter, legal_site, building, civil_structure, level, zone)." ;
            sh:in ( ifcowl:IfcSite pbs:LegalSiteContext bot:Building ifcowl:IfcCivilElement bot:Storey bot:Zone ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 2 ;
            sh:path pbs:context_type ],
        [ sh:class pbs:PerimeterContext ;
            sh:description "Parent perimeter context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:parent_perimeter ],
        [ sh:class pbs:CostRecord ;
            sh:description "Cost records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 11 ;
            sh:path pbs:cost_records ],
        [ sh:class pbs:Entity ;
            sh:description "Zone members; may include spaces, separations, systems, etc." ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:group_members ],
        [ sh:class pbs:Project ;
            sh:description "Parent project reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:parent_project ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 30 ;
            sh:path pbs:revision ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 22 ;
            sh:path pbs:classifications ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 25 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 20 ;
            sh:path pbs:localized_descriptions ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 24 ;
            sh:path pbs:quantity_values ],
        [ sh:description "Optional zone classification; intended for SpatialContext nodes where context_type is zone." ;
            sh:in ( ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ifcowl:IfcGroup ifcowl:IfcSpatialZone ifcowl:IfcSpatialZone ) ;
            sh:maxCount 1 ;
            sh:order 3 ;
            sh:path pbs:zone_type ],
        [ sh:datatype xsd:double ;
            sh:description "Storey elevation relative to project datum (metres)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:elevation ],
        [ sh:class pbs:LegalSiteContext ;
            sh:description "Parent legal site context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:parent_legal_site ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 26 ;
            sh:path pbs:performance_properties ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 31 ;
            sh:path pbs:status ],
        [ sh:class pbs:LevelContext ;
            sh:description "Parent level/storey context reference." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 8 ;
            sh:path pbs:parent_level ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:localized_names ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "context" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 15 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 21 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:Material ;
            sh:description "Material definitions associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 13 ;
            sh:path pbs:materials ],
        [ sh:datatype xsd:string ;
            sh:description "Unit for elevation (default m)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:elevation_unit ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 29 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:name ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 27 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 18 ;
            sh:path pbs:description ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 19 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:TimeRecord ;
            sh:description "Time records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 12 ;
            sh:path pbs:time_records ] ;
    sh:targetClass pbs:LevelContext .

pbs:Material a sh:NodeShape ;
    rdfs:comment "Material definition that can be associated with one or more entities." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 18 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 20 ;
            sh:path pbs:modified_at ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 16 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:Material ;
            sh:description "Material definitions associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 4 ;
            sh:path pbs:materials ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 22 ;
            sh:path pbs:status ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:CostRecord ;
            sh:description "Cost records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 2 ;
            sh:path pbs:cost_records ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 21 ;
            sh:path pbs:revision ],
        [ sh:datatype xsd:string ;
            sh:description "Material grade, specification, or product description." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:material_specification ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:id ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 8 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 17 ;
            sh:path pbs:performance_properties ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "virtual" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 6 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:name ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:class pbs:TimeRecord ;
            sh:description "Time records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:time_records ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 14 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 13 ;
            sh:path pbs:classifications ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:created_at ],
        [ sh:datatype xsd:string ;
            sh:description "Material category label kept intentionally open pending classification-backed modeling." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:material_category ] ;
    sh:targetClass pbs:Material .

pbs:TimeRecord a sh:NodeShape ;
    rdfs:comment "Planned work record with baseline and actual dates, optionally linked to model entities and a time plan. — Set milestone_at to mark as a zero-duration checkpoint. — Populate component_time_items to act as a plan container." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 19 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:name ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 22 ;
            sh:path pbs:quantity_values ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:in ( "virtual" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 13 ;
            sh:path pbs:content_kind ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 25 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:TimeRecord ;
            sh:description "Time records contained in this plan; set milestone_at on a record to mark it as a checkpoint." ;
            sh:nodeKind sh:IRI ;
            sh:order 7 ;
            sh:path pbs:component_time_items ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 24 ;
            sh:path pbs:performance_properties ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 18 ;
            sh:path pbs:localized_descriptions ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Planned start timestamp for the time record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:planned_start_at ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 27 ;
            sh:path pbs:revision ],
        [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 12 ;
            sh:path pbs:id ],
        [ sh:class pbs:TimeRecord ;
            sh:description "Parent time plan this record belongs to." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 0 ;
            sh:path pbs:time_plan ],
        [ sh:class pbs:TimeRecord ;
            sh:description "Time records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 10 ;
            sh:path pbs:time_records ],
        [ sh:class pbs:Material ;
            sh:description "Material definitions associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 11 ;
            sh:path pbs:materials ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Planned finish timestamp for the time record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:planned_finish_at ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 15 ;
            sh:path pbs:localized_names ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 17 ;
            sh:path pbs:meaning_uri ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 28 ;
            sh:path pbs:status ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Target timestamp for a zero-duration milestone checkpoint." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:milestone_at ],
        [ sh:class pbs:TimeLink ;
            sh:description "Forward precedence links to successor records. Reverse lookup (find all predecessors of X) requires scanning all TimeRecord.successors — acceptable for document exchange, not for live graph queries." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 8 ;
            sh:path pbs:successors ],
        [ sh:class pbs:CostRecord ;
            sh:description "Cost records associated with this entity." ;
            sh:nodeKind sh:IRI ;
            sh:order 9 ;
            sh:path pbs:cost_records ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 23 ;
            sh:path pbs:metadata ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 20 ;
            sh:path pbs:classifications ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:applies_to_entities ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:description ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 21 ;
            sh:path pbs:geometry_representations ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Actual start timestamp for the time record where known." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:actual_start_at ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 26 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Actual finish timestamp for the time record where known." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:actual_finish_at ] ;
    sh:targetClass pbs:TimeRecord .

pbs:GeometryRepresentation a sh:NodeShape ;
    rdfs:comment "Minimal geometry reference for an entity, separating representation from encoding format." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:description "Representation kind/dimension (for example body_3d, footprint_2d, point), independent of file format." ;
            sh:in ( "axis" "body_3d" "footprint_2d" "point" ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 1 ;
            sh:path pbs:geometry_representation ],
        [ sh:datatype xsd:string ;
            sh:description "Optional serialization/encoding format (for example ifc, gltf, wkt, geojson), independent of representation kind." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:geometry_format ],
        [ sh:datatype xsd:string ;
            sh:description "URI/path/hash/pointer to geometry payload." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:geometry_reference ] ;
    sh:targetClass pbs:GeometryRepresentation .

pbs:MetadataEntry a sh:NodeShape ;
    rdfs:comment "Generic metadata entry for storing IFC attributes, PropertySet fields, or project-specific key-value data." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "Metadata key, for example IfcWall.FireRating or Pset_WallCommon.Reference." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:metadata_key ],
        [ sh:datatype xsd:string ;
            sh:description "Metadata value serialized as text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:metadata_value ] ;
    sh:targetClass pbs:MetadataEntry .

pbs:PerformanceProperty a sh:NodeShape ;
    rdfs:comment """Normalized performance/property record derived from raw IFC PropertySet values with source traceability and strong typing through domain-specific subclasses.
""" ;
    sh:closed false ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "Raw source value before normalization." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 9 ;
            sh:path pbs:source_value_raw ],
        [ sh:datatype xsd:double ;
            sh:description "Numeric value when property_value_type is number." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 3 ;
            sh:path pbs:property_value_number ],
        [ sh:datatype xsd:string ;
            sh:description "Normalized unit where applicable (for example min, dB, W/m2K)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:property_unit ],
        [ sh:datatype xsd:string ;
            sh:description "String value when property_value_type is string." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:property_value_string ],
        [ sh:datatype xsd:string ;
            sh:description "Mapping specification version used to derive the normalized property." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 10 ;
            sh:path pbs:mapping_version ],
        [ sh:datatype xsd:string ;
            sh:description "Canonical key inside the domain; constrained via subclass slot_usage to a domain-specific enum." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:property_key ],
        [ sh:description "Optional URI that identifies the normalized property unit in an external vocabulary such as QUDT." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:property_unit_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Original IFC PropertySet name (for example Pset_WallCommon)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:source_pset ],
        [ sh:datatype xsd:boolean ;
            sh:description "Boolean value when property_value_type is boolean." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:property_value_boolean ],
        [ sh:datatype xsd:string ;
            sh:description "Original property name inside the source PropertySet (for example FireRating)." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 8 ;
            sh:path pbs:source_property ],
        [ sh:description "Value type discriminator for normalized storage (for example string, number, boolean)." ;
            sh:in ( pbs:performance_property_value_type_string pbs:performance_property_value_type_number pbs:performance_property_value_type_boolean ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 1 ;
            sh:path pbs:property_value_type ] ;
    sh:targetClass pbs:PerformanceProperty .

pbs:QuantityValue a sh:NodeShape ;
    rdfs:comment "Minimal quantity record for costing and analysis." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:double ;
            sh:description "Numeric quantity value." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:quantity_value ],
        [ sh:datatype xsd:string ;
            sh:description "skos:notation of the concept in the matching abstract metric or ratio scheme." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:metric_code ],
        [ sh:description "Controlled quantity type." ;
            sh:in ( ifcowl:IfcQuantityArea ifcowl:IfcQuantityArea ifcowl:IfcQuantityArea ifcowl:IfcQuantityArea ifcowl:IfcQuantityVolume ifcowl:IfcQuantityVolume ifcowl:IfcQuantityLength ifcowl:IfcQuantityLength ifcowl:IfcQuantityLength ifcowl:IfcQuantityLength pbs:quantity_type_count pbs:quantity_type_ratio ) ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:order 0 ;
            sh:path pbs:quantity_type ],
        [ sh:datatype xsd:string ;
            sh:description "Unit of the quantity value." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:quantity_unit ],
        [ sh:description "Concept URI from building-metrics.skos.ttl or building-ratios.skos.ttl." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 6 ;
            sh:path pbs:metric_uri ],
        [ sh:description "Optional URI that identifies the quantity unit in an external vocabulary such as QUDT." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:quantity_unit_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Vocabulary scheme identifier for the measured concept: AbstractBuildingMetric or AbstractBuildingRatio." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:metric_scheme ] ;
    sh:targetClass pbs:QuantityValue .

pbs:Classification a sh:NodeShape ;
    rdfs:comment "Generic classification entry from any scheme (for example IFC, Uniclass, OmniClass, custom)." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "Classification code inside the scheme." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:classification_code ],
        [ sh:datatype xsd:string ;
            sh:description "Name of the classification scheme (for example ifc, uniclass, omniclass, custom)." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:classification_scheme ],
        [ sh:datatype xsd:string ;
            sh:description "Optional human-readable classification label." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:classification_label ],
        [ sh:description "Optional URI/CURIE that identifies the classification concept in an external registry." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 3 ;
            sh:path pbs:classification_uri ],
        [ sh:datatype xsd:string ;
            sh:description "Source authority or dataset for this classification." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 5 ;
            sh:path pbs:classification_source ],
        [ sh:datatype xsd:string ;
            sh:description "Optional scheme/version identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:classification_version ] ;
    sh:targetClass pbs:Classification .

pbs:Entity a sh:NodeShape ;
    rdfs:comment "Common base class for everything in the project graph. Has identity, lifecycle, and status." ;
    sh:closed false ;
    sh:ignoredProperties ( pbs:group_members pbs:target_value_string pbs:requirement_property_key pbs:currency rdfs:comment pbs:substitutes_allowed pbs:material_category pbs:vendor pbs:deliverable_format pbs:related_time_record pbs:cost_records pbs:serves_spaces pbs:component_cost_items pbs:min_clear_distance pbs:cost_quantity_value pbs:space_name_type pbs:target_unit_uri pbs:is_above_ground dcterms:created pbs:related_entity dcterms:description pbs:connection_physical_requirement_drivers pbs:contract_parties pbs:software_version pbs:is_heated pbs:program_code pbs:personal_data_processing_state pbs:contained_entities pbs:catalog_cost_records pbs:target_value_boolean pbs:deliverable_kind pbs:signed_artifact pbs:artifact_kind pbs:clause_ref pbs:frame_material pbs:separator_slab_type pbs:min_height pbs:consent_records pbs:bounded_by pbs:product_code pbs:service_endpoint pbs:deliverable_code pbs:elevation_unit pbs:process_participants pbs:transport_medium pbs:cost_quantity_unit pbs:cost_record_role pbs:separator_requirement_drivers pbs:equipment_type pbs:parent_legal_site pbs:component_time_items pbs:separates_spaces pbs:target_value_number pbs:is_cooled pbs:cost_category schema:sender pbs:contact_points pbs:processing_purposes pbs:system_type pbs:parent_building schema:recipient pbs:target_operator schema:actionStatus pbs:parent_system pbs:contract_reference pbs:parent_project pbs:effective_until pbs:space_type <http://www.w3.org/ns/adms#status> pbs:time_records pbs:statement pbs:target_unit pbs:parent_level pbs:related_material pbs:related_product pbs:bounded_space pbs:time_plan pbs:belongs_to_company pbs:storage_link pbs:signed_at pbs:actual_start_at pbs:elevation pbs:acceptance_criteria pbs:parent_space pbs:postal_addresses pbs:min_area pbs:zone_type pbs:materials prov:wasAttributedTo pbs:adjacency_kind pbs:data_controller pbs:connection_virtual_type pbs:context_type schema:headline pbs:media_format pbs:actual_finish_at pbs:redaction_reason pbs:programme_ref schema:dateSent pbs:material_specification schema:agent prov:used pbs:lifecycle_status schema:text pbs:connection_physical_type pbs:client pbs:jurisdiction pbs:serves_zones pbs:separates_levels pbs:connection_functional_types pbs:parent_process pbs:separator_wall_type schema:deadline dcterms:type pbs:person_relationships pbs:parent_program pbs:privacy_policy_uri pbs:norm_uri pbs:connects_physical_elements pbs:priced_for_customer pbs:source_artifact pbs:process_definition_uri pbs:redacted_at pbs:external_instance_uri rdf:type pbs:milestone_at pbs:operated_by pbs:boundary_type pbs:project_code pbs:completed_at pbs:effective_from pbs:earliest_start_at pbs:connection_virtual_requirement_drivers pbs:infill_material pbs:planned_finish_at pbs:unit_cost pbs:system_discipline pbs:successors pbs:cost_quantity_type pbs:connects_spaces pbs:planned_start_at pbs:retain_until pbs:parent_zone schema:birthDate pbs:parent_perimeter ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "Unique local identifier." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:id ],
        [ sh:datatype xsd:integer ;
            sh:description "Integer revision counter for change tracking." ;
            sh:maxCount 1 ;
            sh:minInclusive 0 ;
            sh:nodeKind sh:Literal ;
            sh:order 16 ;
            sh:path pbs:revision ],
        [ sh:class pbs:Classification ;
            sh:description "Classification entries from IFC and other schemes." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 8 ;
            sh:path pbs:classifications ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Last modification timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 15 ;
            sh:path pbs:modified_at ],
        [ sh:datatype xsd:string ;
            sh:description "IFC GlobalId of the mapped entity." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 7 ;
            sh:path pbs:ifc_global_id ;
            sh:pattern "^[0-3][0-9A-Za-z_$]{21}$" ],
        [ sh:datatype xsd:string ;
            sh:description "Default display name." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 2 ;
            sh:path pbs:name ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of name." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 3 ;
            sh:path pbs:localized_names ],
        [ sh:class pbs:PerformanceProperty ;
            sh:description """Normalized, strongly typed domain properties (fire/acoustic/thermal/structural/ security/material) extracted from raw IFC PropertySet values.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 12 ;
            sh:path pbs:performance_properties ],
        [ sh:datatype xsd:string ;
            sh:description "Default description text." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 4 ;
            sh:path pbs:description ],
        [ sh:datatype xsd:string ;
            sh:description "Entity type discriminator for adapter projection and querying. Must be a ContentKind value." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:content_kind ],
        [ sh:class pbs:GeometryRepresentation ;
            sh:description """Geometry references associated with the entity. A single element may link to multiple geometry representations to serve different intents (authoring, coordination, analysis, visualization) without duplicating the element itself.
""" ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 9 ;
            sh:path pbs:geometry_representations ],
        [ sh:class pbs:LocalizedText ;
            sh:description "Localized variants of description." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 6 ;
            sh:path pbs:localized_descriptions ],
        [ sh:description "Optional semantic URI for linking the entity instance to an external ontology concept." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:IRI ;
            sh:order 5 ;
            sh:path pbs:meaning_uri ],
        [ sh:class pbs:Entity ;
            sh:description "Model entities this record applies to (requirements, cost items, schedule items, etc.)." ;
            sh:nodeKind sh:IRI ;
            sh:order 13 ;
            sh:path pbs:applies_to_entities ],
        [ sh:description "Lifecycle or QA status." ;
            sh:in ( pbs:status_draft pbs:status_submitted pbs:status_reviewed pbs:status_approved pbs:status_rejected pbs:status_archived ) ;
            sh:maxCount 1 ;
            sh:order 17 ;
            sh:path pbs:status ],
        [ sh:class pbs:MetadataEntry ;
            sh:description "Generic metadata container for IFC attributes/properties and project-specific extensions." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 11 ;
            sh:path pbs:metadata ],
        [ sh:datatype xsd:dateTime ;
            sh:description "Creation timestamp for this entity record." ;
            sh:maxCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 14 ;
            sh:path pbs:created_at ],
        [ sh:class pbs:QuantityValue ;
            sh:description "Quantities associated with the entity." ;
            sh:nodeKind sh:BlankNodeOrIRI ;
            sh:order 10 ;
            sh:path pbs:quantity_values ] ;
    sh:targetClass pbs:Entity .

pbs:LocalizedText a sh:NodeShape ;
    rdfs:comment "Localized text value for a specific language tag." ;
    sh:closed true ;
    sh:ignoredProperties ( rdf:type ) ;
    sh:property [ sh:datatype xsd:string ;
            sh:description "Localized text value." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 1 ;
            sh:path pbs:text_value ],
        [ sh:datatype xsd:string ;
            sh:description "IETF BCP 47 language tag (for example en, de, pt-BR)." ;
            sh:maxCount 1 ;
            sh:minCount 1 ;
            sh:nodeKind sh:Literal ;
            sh:order 0 ;
            sh:path pbs:language_tag ] ;
    sh:targetClass pbs:LocalizedText .


