{
  "busVersion": "0.3",
  "title": "BUS-1 v0.3 crosswalk: Brick Schema",
  "status": "PROVISIONAL. Normative for the classification, medium, unit and medium-fallback rules it states; informative elsewhere. Implements recommendations R6 and R8 of the three-way gap analysis.",
  "generator": "Generated by tools/gen_crosswalk.py from the ontology extracts under BUS_ONTOLOGY_DIR. Do not hand-edit: every count here is computed from source data and a hand edit will drift. Regenerate instead.",
  "scope": "This file does not map Brick's 1,433 classes onto BUS classes. BUS defines no equipment taxonomy (5.3.3) and preserves external classifications verbatim (7.7), so a Brick class reaches a package as a classification, not as a type. What this file fixes is the branch each class lands on, the predicate each relation becomes, and what happens where Brick cannot supply what BUS requires.",
  "normativeBasis": {
    "1.4": "Scope exclusions. Equipment taxonomy and field protocol behaviour are out of scope.",
    "5.3.3": "Structure is specified; taxonomy is preserved. The reason this file is a rule set, not a class table.",
    "6.1": "Identifier form. A BUS id is an absolute URI; a source identifier is not one.",
    "6.3": "External identifiers. Every foreign identifier is recorded, not discarded.",
    "7.4": "Quantities and unit codes. Requirement 7.4-1: an importer MUST NOT convert.",
    "7.5": "Enumerations. Unknown members are preserved, not dropped.",
    "7.7": "Classifications. Requirement 7.7-1: preserved verbatim, never normalized, translated, deduplicated or dropped.",
    "7.8": "Property definitions. Anything with no named BUS field becomes a property against a declared definition.",
    "8.2": "Abstract types. How a receiver places an entity whose leaf class it does not know.",
    "8.6": "Points.",
    "8.7": "Telemetry binding. Address and parameters are opaque and preserved verbatim.",
    "8.8": "History at the interface. BUS carries the declaration that history exists, not the series.",
    "9.2": "The normative predicate set.",
    "9.3": "Predicate semantics. bus:feeds MUST carry a medium; bus:measures and bus:commands MUST have a point as subject.",
    "9.4": "Ports.",
    "14.1": "Provenance. method is REQUIRED, so an import MUST assert method 'imported' rather than leave provenance absent.",
    "15.5": "Promotion. The route by which a construct in this file becomes core vocabulary.",
    "16.6": "The completeness declaration. Requirement 16.6-1: every domain declared, every non-complete domain carrying a reason code."
  },
  "fidelityScale": {
    "exact": "The source term and the BUS term denote the same thing. A round trip through BUS loses nothing this crosswalk is responsible for.",
    "narrowing": "The BUS target is more specific than the source term. The importer must supply a fact the source does not carry, and MUST NOT guess it: where the fact is unavailable the construct is omitted and the affected domain declared partial (16.6).",
    "widening": "The BUS target is broader than the source term. A distinction the source draws is not expressible in BUS structure. The source term itself survives verbatim in classifications (7.7), so the fact is not lost from the package, only from the structural layer.",
    "conditional": "Which BUS construct is correct depends on facts in the instance data that the vocabulary does not fix — the type of the endpoints, whether a sibling assertion is present. The rule states the branches.",
    "none": "No BUS structural expression exists. The construct is carried verbatim in classifications, properties or qualifiers, or it is dropped and the loss declared. Listed in unmappable."
  },
  "source": {
    "ontology": "Brick",
    "version": "1.4.4",
    "ontologyIRI": "https://brickschema.org/schema/1.4/Brick",
    "namespace": "https://brickschema.org/schema/Brick#",
    "obtainedFrom": "pip install brickschema (bundled ontology file); cross-checked against git clone https://github.com/BrickSchema/Brick.git",
    "commitOrPackage": "brickschema==0.7.9 (PyPI wheel); ontology file /usr/local/lib/python3.11/dist-packages/brickschema/ontologies/1.4/Brick.ttl; md5=7ac88fe76fcc5fd9ae7fb360434d6446; git HEAD 6f2acd09c7dac3a2a2d9eaadec47c56ba29fdef0 (tag: nightly, 2026-07-24)",
    "ontologyModified": "2025-11-23",
    "tripleCount": 60604,
    "owlImports": [
      "http://data.ashrae.org/bacnet/2020",
      "http://datashapes.org/dash",
      "http://qudt.org/3.1.8/vocab/quantitykind",
      "http://qudt.org/3.1.8/vocab/unit",
      "https://brickschema.org/schema/Brick/ref",
      "https://w3id.org/rec/brickpatches",
      "https://w3id.org/rec/recimports"
    ],
    "classCountsByNamespace": {
      "http://www.w3.org/ns/sosa/": 2,
      "https://brickschema.org/schema/Brick#": 1433,
      "https://brickschema.org/schema/Brick/ref#": 5,
      "https://brickschema.org/schema/BrickShape#": 5,
      "https://w3id.org/rec#": 268
    },
    "counts": {
      "classes": 1433,
      "relationships": 37,
      "entityProperties": 48,
      "tags": 533,
      "classesCarryingAtLeastOneTag": 1249,
      "quantities": 52,
      "substances": 60,
      "referencedQuantityKinds": 54,
      "referencedQudtUnits": 205,
      "deprecatedClasses": 185,
      "pointCone": 938,
      "equipmentCone": 335,
      "locationCone": 109,
      "collectionCone": 45
    }
  },
  "target": {
    "standard": "BUS-1",
    "busVersion": "0.3",
    "schema": "https://spec.bustandard.org/v0.3/bus-core.schema.json",
    "counts": {
      "entityClasses": 26,
      "predicates": 44,
      "mediumValues": 13,
      "unitCodes": 77
    }
  },
  "entityTypeMapPolicy": "Brick's class tree is a taxonomy and BUS does not map taxonomies. The map below is at the branch level: every one of the 1433 classes falls under exactly one of the mapped top-level branches, which the coverage block proves, and the entries at the second level are those where the branch determines a BUS enum value — pointKind from Point's six children, spaceKind from Location's ten, systemKind from Collection's. The leaf class itself always travels as a classification (7.7) and SHOULD also appear in abstractTypes (8.2) so a receiver can place an entity whose leaf class it does not know.",
  "entityTypeMap": [
    {
      "source": "brick:Alarm",
      "label": "Alarm",
      "depth": 2,
      "coneSize": 65,
      "deprecated": false,
      "busType": "bus:Point",
      "busFields": {
        "pointKind": "status"
      },
      "fidelity": "conditional",
      "note": "BUS has no alarm pointKind: 11.1 moves alarm configuration to bus:AlarmDefinition and occurrences to bus:Event. Rule: emit the point as pointKind 'status' AND emit a bus:AlarmDefinition attached by bus:appliesTo, carrying whatever limits the model supplies. Brick supplies none — its delays and sensitivities are separate Parameter points — so the AlarmDefinition is a shell, and the exporter MUST declare the alarms domain partial (16.6) rather than imply the configuration was captured."
    },
    {
      "source": "brick:Building",
      "label": "Building",
      "depth": 2,
      "coneSize": 2,
      "deprecated": true,
      "busType": "bus:Building",
      "fidelity": "exact",
      "note": "Deprecated in favour of rec:Building."
    },
    {
      "source": "brick:Camera",
      "label": "Camera",
      "depth": 2,
      "coneSize": 2,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "device"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:Class",
      "label": "Class",
      "depth": 1,
      "coneSize": 1431,
      "deprecated": false,
      "busType": null,
      "fidelity": "none",
      "note": "A meta-branch holding the four substantive branches. Not an entity a building contains."
    },
    {
      "source": "brick:Collection",
      "label": "Collection",
      "depth": 1,
      "coneSize": 45,
      "deprecated": false,
      "busType": "bus:System",
      "busFields": {
        "systemKind": "other"
      },
      "fidelity": "conditional",
      "note": "Brick's grouping branch. System and Loop become bus:System; Portfolio has no BUS entity at all (a package describes one building, 16.2)."
    },
    {
      "source": "brick:Command",
      "label": "Command",
      "depth": 2,
      "coneSize": 75,
      "deprecated": false,
      "busType": "bus:Point",
      "busFields": {
        "pointKind": "command"
      },
      "fidelity": "exact"
    },
    {
      "source": "brick:EV_Charging_Hub",
      "label": "EV Charging Hub",
      "depth": 2,
      "coneSize": 1,
      "deprecated": false,
      "busType": "bus:System",
      "busFields": {
        "systemKind": "electrical",
        "medium": "electricity"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:Electric_Vehicle_Charging_Hub",
      "label": "Electric Vehicle Charging Hub",
      "depth": 2,
      "coneSize": 1,
      "deprecated": false,
      "busType": "bus:System",
      "busFields": {
        "systemKind": "electrical",
        "medium": "electricity"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:Electrical_Equipment",
      "label": "Electrical Equipment",
      "depth": 2,
      "coneSize": 23,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:Elevator",
      "label": "Elevator",
      "depth": 2,
      "coneSize": 1,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:Entity",
      "label": "Entity",
      "depth": 0,
      "coneSize": 1433,
      "deprecated": false,
      "busType": null,
      "fidelity": "none",
      "note": "The abstract root. Not a BUS class."
    },
    {
      "source": "brick:Equipment",
      "label": "Equipment",
      "depth": 1,
      "coneSize": 335,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "335 classes onto one BUS class and four assetKind values."
    },
    {
      "source": "brick:Fire_Safety_Equipment",
      "label": "Fire Safety Equipment",
      "depth": 2,
      "coneSize": 9,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:Floor",
      "label": "Floor",
      "depth": 2,
      "coneSize": 4,
      "deprecated": true,
      "busType": "bus:Space",
      "busFields": {
        "spaceKind": "storey"
      },
      "fidelity": "exact",
      "note": "Deprecated in favour of rec:Level. BUS orders storeys by a signed Space.ordinal; Brick carries no storey ordering at all, so the ordinal MUST be left absent rather than parsed out of a label."
    },
    {
      "source": "brick:Furniture",
      "label": "Furniture",
      "depth": 2,
      "coneSize": 2,
      "deprecated": true,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "Deprecated in Brick 1.4; see deprecation."
    },
    {
      "source": "brick:Gas_Distribution",
      "label": "Gas Distribution",
      "depth": 2,
      "coneSize": 1,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:HVAC_Equipment",
      "label": "HVAC Equipment",
      "depth": 2,
      "coneSize": 180,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:ICT_Equipment",
      "label": "ICT Equipment",
      "depth": 2,
      "coneSize": 25,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "device"
      },
      "fidelity": "conditional",
      "note": "Controllers, gateways, routers and switches. BUS declined the ICT class tree (5.3.3): a BACnet router is a bus:Asset with assetKind 'device' and a classification. A router is NOT a bus:Network — the network is the wire, not the box — and an importer MUST NOT create one from an ICT_Equipment instance."
    },
    {
      "source": "brick:Lighting_Equipment",
      "label": "Lighting Equipment",
      "depth": 2,
      "coneSize": 8,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:Location",
      "label": "Location",
      "depth": 1,
      "coneSize": 109,
      "deprecated": true,
      "busType": "bus:Space",
      "busFields": {
        "spaceKind": "other"
      },
      "fidelity": "conditional",
      "note": "Every one of the 109 classes in this branch is deprecated in favour of rec:. See deprecation: the classification rule emits both codes."
    },
    {
      "source": "brick:Loop",
      "label": "Loop",
      "depth": 2,
      "coneSize": 7,
      "deprecated": false,
      "busType": "bus:System",
      "busFields": {
        "systemKind": "hvac"
      },
      "fidelity": "widening",
      "note": "The seven Loop classes name their medium (Chilled_Water_Loop and so on) which becomes System.medium. BUS has no loop-versus-system distinction and no primary/secondary/tertiary loop vocabulary; both are lost from structure."
    },
    {
      "source": "brick:Measurable",
      "label": "Measurable",
      "depth": 1,
      "coneSize": 3,
      "deprecated": false,
      "busType": null,
      "fidelity": "none",
      "note": "A vocabulary branch, not an entity branch: it holds the quantity and substance concepts."
    },
    {
      "source": "brick:Meter",
      "label": "Meter",
      "depth": 2,
      "coneSize": 14,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "conditional",
      "note": "The meter is an asset; its register is a bus:Point with pointKind 'meter'. brick:isVirtualMeter true maps to Point.meterScope 'virtual' on that register, not to a field on the asset."
    },
    {
      "source": "brick:Motor",
      "label": "Motor",
      "depth": 2,
      "coneSize": 6,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "component"
      },
      "fidelity": "conditional",
      "note": "A motor is usually a component of a fan or pump. Rule: assetKind 'component' where an isPartOf edge exists, 'equipment' otherwise."
    },
    {
      "source": "brick:Outdoor_Area",
      "label": "Outdoor Area",
      "depth": 2,
      "coneSize": 4,
      "deprecated": true,
      "busType": "bus:Space",
      "busFields": {
        "spaceKind": "exterior"
      },
      "fidelity": "exact",
      "note": "Deprecated in favour of rec:OutdoorSpace."
    },
    {
      "source": "brick:Outside",
      "label": "Outside",
      "depth": 2,
      "coneSize": 1,
      "deprecated": true,
      "busType": "bus:Space",
      "busFields": {
        "spaceKind": "exterior"
      },
      "fidelity": "widening",
      "note": "Deprecated in favour of rec:OutdoorSpace. 'Outside' as a boundary condition rather than a place has no BUS expression; where it is used as the far end of a feeds edge the honest form is to omit the entity and leave the edge unterminated, which PK-8 forbids — so the exporter MUST materialize it as a bus:Space with spaceKind 'exterior'."
    },
    {
      "source": "brick:PV_Array",
      "label": "PV Array",
      "depth": 2,
      "coneSize": 1,
      "deprecated": false,
      "busType": "bus:System",
      "busFields": {
        "systemKind": "renewable"
      },
      "fidelity": "exact"
    },
    {
      "source": "brick:PV_Panel",
      "label": "PV Panel",
      "depth": 2,
      "coneSize": 2,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "component"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:Parameter",
      "label": "Parameter",
      "depth": 2,
      "coneSize": 149,
      "deprecated": false,
      "busType": "bus:Point",
      "busFields": {
        "pointKind": "parameter"
      },
      "fidelity": "exact"
    },
    {
      "source": "brick:Photovoltaic_Array",
      "label": "Photovoltaic Array",
      "depth": 2,
      "coneSize": 1,
      "deprecated": true,
      "busType": "bus:System",
      "busFields": {
        "systemKind": "renewable"
      },
      "fidelity": "exact",
      "note": "Deprecated in favour of brick:PV_Array."
    },
    {
      "source": "brick:Point",
      "label": "Point",
      "depth": 1,
      "coneSize": 938,
      "deprecated": false,
      "busType": "bus:Point",
      "fidelity": "widening",
      "note": "938 classes onto one BUS class and seven pointKind values. The class name is the whole of Brick's point semantics and survives verbatim in classifications (7.7)."
    },
    {
      "source": "brick:Portfolio",
      "label": "Portfolio",
      "depth": 2,
      "coneSize": 1,
      "deprecated": true,
      "busType": null,
      "fidelity": "none",
      "note": "A collection of sites. A BUS package is scoped to one building (16.2); a portfolio is above the package boundary. Deprecated in Brick 1.4."
    },
    {
      "source": "brick:Quantity",
      "label": "Quantity",
      "depth": 2,
      "coneSize": 1,
      "deprecated": false,
      "busType": "bus:PropertyDefinition",
      "fidelity": "conditional",
      "note": "A brick:Quantity is a SKOS concept with QUDT dimension vectors. BUS quantity kind is an IdRef to a bus:PropertyDefinition the exporter declares (7.8.1). Rule: mint one PropertyDefinition per distinct Brick quantity encountered and carry the brick: and qudt: terms as its classifications. BUS has no dimension vector (R13 deferred), so the dimensional check Brick supports is not reproducible in the package."
    },
    {
      "source": "brick:Region",
      "label": "Region",
      "depth": 2,
      "coneSize": 1,
      "deprecated": true,
      "busType": "bus:Space",
      "busFields": {
        "spaceKind": "other"
      },
      "fidelity": "widening",
      "note": "Deprecated in favour of rec:Region."
    },
    {
      "source": "brick:Relay",
      "label": "Relay",
      "depth": 2,
      "coneSize": 1,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "component"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:Safety_Equipment",
      "label": "Safety Equipment",
      "depth": 2,
      "coneSize": 8,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:Security_Equipment",
      "label": "Security Equipment",
      "depth": 2,
      "coneSize": 11,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:Sensor",
      "label": "Sensor",
      "depth": 2,
      "coneSize": 301,
      "deprecated": false,
      "busType": "bus:Point",
      "busFields": {
        "pointKind": "sensor"
      },
      "fidelity": "exact"
    },
    {
      "source": "brick:Setpoint",
      "label": "Setpoint",
      "depth": 2,
      "coneSize": 258,
      "deprecated": false,
      "busType": "bus:Point",
      "busFields": {
        "pointKind": "setpoint"
      },
      "fidelity": "exact"
    },
    {
      "source": "brick:Shading_Equipment",
      "label": "Shading Equipment",
      "depth": 2,
      "coneSize": 3,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:Site",
      "label": "Site",
      "depth": 2,
      "coneSize": 1,
      "deprecated": true,
      "busType": "bus:Space",
      "busFields": {
        "spaceKind": "site"
      },
      "fidelity": "exact",
      "note": "Deprecated in favour of rec:Site."
    },
    {
      "source": "brick:Solar_Thermal_Collector",
      "label": "Solar Thermal Collector",
      "depth": 2,
      "coneSize": 2,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:Space",
      "label": "Space",
      "depth": 2,
      "coneSize": 88,
      "deprecated": true,
      "busType": "bus:Space",
      "busFields": {
        "spaceKind": "room"
      },
      "fidelity": "conditional",
      "note": "The 88-class cone under brick:Space is mostly rooms. Rule: spaceKind 'room' for enclosed spaces, 'openArea', 'circulation', 'shaft' or 'plantRoom' where the class name determines it, 'other' otherwise. The class name itself always survives as a classification, so a wrong guess at spaceKind is recoverable and a fabricated one is not."
    },
    {
      "source": "brick:Status",
      "label": "Status",
      "depth": 2,
      "coneSize": 89,
      "deprecated": false,
      "busType": "bus:Point",
      "busFields": {
        "pointKind": "status"
      },
      "fidelity": "exact"
    },
    {
      "source": "brick:Steam_Distribution",
      "label": "Steam Distribution",
      "depth": 2,
      "coneSize": 1,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:Storey",
      "label": "Storey",
      "depth": 2,
      "coneSize": 1,
      "deprecated": true,
      "busType": "bus:Space",
      "busFields": {
        "spaceKind": "storey"
      },
      "fidelity": "exact",
      "note": "Deprecated in favour of rec:Level."
    },
    {
      "source": "brick:Substance",
      "label": "Substance",
      "depth": 2,
      "coneSize": 1,
      "deprecated": false,
      "busType": null,
      "fidelity": "none",
      "note": "Reaches BUS as a Medium value where it sits on a flow, and as a classification otherwise. See mediumMap."
    },
    {
      "source": "brick:System",
      "label": "System",
      "depth": 2,
      "coneSize": 32,
      "deprecated": false,
      "busType": "bus:System",
      "busFields": {
        "systemKind": "other"
      },
      "fidelity": "conditional",
      "note": "Rule: systemKind from the leaf class where it determines one, 'other' otherwise. System.medium from the class name where it names a substance, else absent — never 'other', because a bus:System with medium 'other' says something different from one with no medium."
    },
    {
      "source": "brick:Tag",
      "label": "Tag",
      "depth": 1,
      "coneSize": 1,
      "deprecated": false,
      "busType": null,
      "fidelity": "none",
      "note": "The 533 tag individuals. Reach BUS as classifications under the brick-tag system token; see classificationRule."
    },
    {
      "source": "brick:Tank",
      "label": "Tank",
      "depth": 2,
      "coneSize": 17,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:Valve",
      "label": "Valve",
      "depth": 2,
      "coneSize": 38,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "component"
      },
      "fidelity": "conditional",
      "note": "Rule as brick:Motor. A valve is the case clause 9.4 names: BUS can declare its A and B ports, Brick supplies nothing to fill them."
    },
    {
      "source": "brick:Water_Distribution",
      "label": "Water Distribution",
      "depth": 2,
      "coneSize": 1,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:Water_Heater",
      "label": "Water Heater",
      "depth": 2,
      "coneSize": 7,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening"
    },
    {
      "source": "brick:Weather_Station",
      "label": "Weather Station",
      "depth": 2,
      "coneSize": 1,
      "deprecated": false,
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "BUS declined a weather vocabulary (R11)."
    },
    {
      "source": "brick:Wing",
      "label": "Wing",
      "depth": 2,
      "coneSize": 1,
      "deprecated": true,
      "busType": "bus:Space",
      "busFields": {
        "spaceKind": "other"
      },
      "fidelity": "widening",
      "note": "Deprecated in favour of rec:Wing. BUS has no wing member."
    },
    {
      "source": "brick:Zone",
      "label": "Zone",
      "depth": 2,
      "coneSize": 5,
      "deprecated": true,
      "busType": "bus:Zone",
      "busFields": {
        "zoneKind": "other"
      },
      "fidelity": "conditional",
      "note": "Deprecated in favour of rec:Zone. Rule: zoneKind from the leaf class where it determines one (HVAC_Zone, Lighting_Zone, Fire_Zone), 'other' otherwise."
    }
  ],
  "entityTypeCoverage": {
    "totalClasses": 1433,
    "classesUnderAMappedBranch": 1431,
    "classesUnderNoMappedBranch": [
      "brick:Class",
      "brick:Entity"
    ],
    "classesUnderMoreThanOneMappedBranch": [],
    "byBranch": {
      "brick:Collection": 45,
      "brick:Equipment": 335,
      "brick:Location": 109,
      "brick:Measurable": 3,
      "brick:Point": 938,
      "brick:Tag": 1
    }
  },
  "predicateMap": [
    {
      "source": "brick:aggregationFunction",
      "shaclDomain": [
        "bsh:AggregationShape"
      ],
      "shaclRange": [],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "none",
      "note": "How a point's series is rolled up. BUS has no aggregation field: it becomes a property against a declared PropertyDefinition (7.8). Domain is a SHACL shape, not an entity class.",
      "level": "vocabulary"
    },
    {
      "source": "brick:aliasOf",
      "shaclDomain": [
        "brick:Entity"
      ],
      "shaclRange": [
        "brick:Entity"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "conditional",
      "note": "Entity to entity equivalence. BUS expresses this as bus:IdentityMapping with equivalence 'same', not as a predicate; brick:aliasOf carries no equivalence grading and no foreign authority, so an importer MUST write equivalence 'same' and MUST NOT infer 'narrower' or 'broader'.",
      "busConstruct": "bus:IdentityMapping"
    },
    {
      "source": "brick:ambientTemperatureOfMeasurement",
      "shaclDomain": [
        "bsh:Electric_CurrentQuantityShape",
        "bsh:PowerQuantityShape",
        "bsh:VoltageQuantityShape"
      ],
      "shaclRange": [
        "bsh:TemperatureShape"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "none",
      "note": "The ambient temperature a rating was measured at. A property of a property; BUS has no qualifier on a property value.",
      "level": "vocabulary"
    },
    {
      "source": "brick:connectedTo",
      "shaclDomain": [],
      "shaclRange": [],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": "bus:connectedTo",
      "fidelity": "conditional",
      "note": "Bare symmetric predicate with no SHACL domain, no range, no direction and no medium. BUS bus:connectedTo is symmetric too and does not require a medium (9.3 requires it only on bus:feeds), so this is the one flow predicate that survives — but it survives empty. Where the source graph also asserts hasInputSubstance or hasOutputSubstance on an endpoint, the importer MAY add medium; where it does not, medium is absent and that is valid.",
      "mediumSatisfiable": false
    },
    {
      "source": "brick:deprecatedInVersion",
      "shaclDomain": [
        "bsh:DeprecationRule",
        "bsh:DeprecationShape"
      ],
      "shaclRange": [
        "xsd:string"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "none",
      "note": "Vocabulary-term deprecation. BUS has Versioning.deprecated on an entity but no mechanism for deprecating a vocabulary term; R9 proposes one. Carried in the deprecation block of this file, not in a package.",
      "level": "vocabulary"
    },
    {
      "source": "brick:deprecation",
      "shaclDomain": [
        "brick:Entity"
      ],
      "shaclRange": [
        "bsh:DeprecationShape"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "none",
      "note": "As brick:deprecatedInVersion.",
      "level": "vocabulary"
    },
    {
      "source": "brick:deprecationMitigationMessage",
      "shaclDomain": [
        "bsh:DeprecationRule",
        "bsh:DeprecationShape"
      ],
      "shaclRange": [
        "xsd:string"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "none",
      "note": "As brick:deprecatedInVersion.",
      "level": "vocabulary"
    },
    {
      "source": "brick:deprecationMitigationRule",
      "shaclDomain": [
        "bsh:DeprecationRule",
        "bsh:DeprecationShape"
      ],
      "shaclRange": [
        "sh:NodeShape"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "none",
      "note": "As brick:deprecatedInVersion. A SHACL rule that rewrites a deprecated instance; BUS has no rule language.",
      "level": "vocabulary"
    },
    {
      "source": "brick:feeds",
      "shaclDomain": [
        "brick:Equipment",
        "brick:HVAC_Equipment",
        "brick:Lighting_Equipment"
      ],
      "shaclRange": [],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": "brick:isFedBy",
      "busPredicate": "bus:feeds",
      "fidelity": "conditional",
      "note": "THIS IS THE R8 CASE. BUS 9.3 REQUIRES a medium on every bus:feeds. Brick puts the substance on the node, via hasInputSubstance and hasOutputSubstance whose SHACL domain is brick:Equipment, so a chiller emitting chilled water on one edge and condenser water on another does not say which goes where. Rule: where the subject has exactly one output substance and that substance maps to a BUS medium, the importer MAY use it; in every other case the importer MUST emit medium 'other', MUST carry the source substance terms verbatim in Relationship.qualifiers, and MUST declare the relationships domain partial with reason notSupportedByExporter (16.6). It MUST NOT omit the medium: that produces an invalid package.",
      "mediumSatisfiable": false,
      "mediumSource": "nodeSubstance"
    },
    {
      "source": "brick:hasAddress",
      "shaclDomain": [
        "brick:Building"
      ],
      "shaclRange": [
        "vcard:Address"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "conditional",
      "note": "Building to a vcard:Address node. BUS Building.address is a structured Address object; the field names differ and the importer maps them. Not a relationship in BUS.",
      "busConstruct": "Building.address"
    },
    {
      "source": "brick:hasAmbientTemperature",
      "shaclDomain": [],
      "shaclRange": [],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "none",
      "note": "As brick:ambientTemperatureOfMeasurement.",
      "level": "vocabulary"
    },
    {
      "source": "brick:hasAssociatedTag",
      "shaclDomain": [
        "owl:Class"
      ],
      "shaclRange": [
        "brick:Tag"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": "brick:isAssociatedWith",
      "busPredicate": null,
      "fidelity": "none",
      "note": "Class to tag, at the ontology level: 1,249 of the 1,433 classes carry at least one. Not instance data, so it produces no package content. The tags an instance carries through its class are recoverable, and the classification rule states whether to emit them.",
      "level": "vocabulary"
    },
    {
      "source": "brick:hasInputSubstance",
      "shaclDomain": [
        "brick:Equipment"
      ],
      "shaclRange": [
        "brick:Substance"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "conditional",
      "note": "Node-level substance. It is NOT a BUS relationship and MUST NOT become one. Rule: it MAY supply Relationship.medium on an incoming bus:feeds when the asset has exactly one input substance; it MUST NOT be used to synthesize a bus:Port, because it gives no port count, no name, no ordinal and no pairing, and Asset.ports says an exporter that does not know the port structure omits it.",
      "busConstruct": "Relationship.medium"
    },
    {
      "source": "brick:hasLocation",
      "shaclDomain": [
        "brick:Entity",
        "brick:Equipment",
        "brick:Point"
      ],
      "shaclRange": [
        "brick:Location"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": "brick:isLocationOf",
      "busPredicate": "bus:locatedIn",
      "fidelity": "conditional",
      "note": "Rule: entity in a location is bus:locatedIn; where both endpoints are locations the correct BUS predicate is bus:containedIn, because BUS distinguishes containment from placement (9.2).",
      "alternatePredicates": [
        "bus:containedIn"
      ]
    },
    {
      "source": "brick:hasOutputSubstance",
      "shaclDomain": [
        "brick:Equipment"
      ],
      "shaclRange": [
        "brick:Substance"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "conditional",
      "note": "As brick:hasInputSubstance, for outgoing edges.",
      "busConstruct": "Relationship.medium"
    },
    {
      "source": "brick:hasPart",
      "shaclDomain": [
        "brick:Building",
        "brick:Collection",
        "brick:Electric_Vehicle_Charging_Hub",
        "brick:Electric_Vehicle_Charging_Station",
        "brick:Equipment",
        "brick:Floor",
        "brick:HVAC_Equipment",
        "brick:Lighting_Equipment",
        "brick:Location",
        "brick:Loop",
        "brick:Photovoltaic_Array",
        "brick:Portfolio",
        "brick:Site",
        "brick:System",
        "brick:Zone",
        "bsh:hasHotColdDeck"
      ],
      "shaclRange": [
        "brick:Electric_Vehicle_Charging_Port",
        "brick:Electric_Vehicle_Charging_Station",
        "brick:Equipment",
        "brick:PV_Panel",
        "brick:Site"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": "brick:isPartOf",
      "busPredicate": "bus:hasPart",
      "fidelity": "conditional",
      "note": "Brick overloads one predicate across three BUS pairs. Its SHACL domain lists 16 classes and its range 5. Rule: equipment to equipment or component, bus:hasPart; location to location, bus:contains; collection, system, loop or portfolio to a member, bus:hasMember; building to site, bus:containedIn reversed. A translator that maps all of them to bus:hasPart asserts that a chiller is a component of the chilled water loop, which is a different claim from membership and does not survive re-export.",
      "alternatePredicates": [
        "bus:contains",
        "bus:hasMember",
        "bus:containedIn"
      ]
    },
    {
      "source": "brick:hasPoint",
      "shaclDomain": [
        "brick:Equipment",
        "brick:Location"
      ],
      "shaclRange": [
        "brick:Point"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": "brick:isPointOf",
      "busPredicate": "bus:hasPart",
      "fidelity": "conditional",
      "note": "Brick's only equipment-to-point link, with SHACL domain Equipment or Location. Rule: equipment to point, bus:hasPart; location to point, bus:contains. Note what is NOT derivable: bus:hosts (which device gives the point an address) has no Brick counterpart at all, so an importer MUST NOT emit bus:hosts from hasPoint.",
      "alternatePredicates": [
        "bus:contains"
      ]
    },
    {
      "source": "brick:hasQUDTReference",
      "shaclDomain": [
        "brick:Quantity"
      ],
      "shaclRange": [
        "qudt:QuantityKind"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "none",
      "note": "Brick quantity to a QUDT quantity kind. Vocabulary level; reaches BUS as a classification on the PropertyDefinition the importer declares.",
      "level": "vocabulary"
    },
    {
      "source": "brick:hasQuantity",
      "shaclDomain": [
        "brick:Point",
        "bsh:PointsHaveQuantityKinds"
      ],
      "shaclRange": [
        "brick:Quantity",
        "qudt:QuantityKind"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "conditional",
      "note": "Point to a quantity concept. BUS Point.quantityKind is an IdRef to a bus:PropertyDefinition the exporter declares (7.8.1), not a token, so the importer mints one definition per distinct quantity and carries the brick: and qudt: terms as its classifications.",
      "busConstruct": "Point.quantityKind"
    },
    {
      "source": "brick:hasSubMeter",
      "shaclDomain": [
        "brick:Meter"
      ],
      "shaclRange": [
        "brick:Meter"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": "brick:isSubMeterOf",
      "busPredicate": "bus:hasSubMeter",
      "fidelity": "exact",
      "note": "New in BUS v0.3, promoted precisely because Brick and Haystack converged on it (15.5). Both endpoints are meters in both models."
    },
    {
      "source": "brick:hasSubstance",
      "shaclDomain": [
        "brick:Meter",
        "brick:Point"
      ],
      "shaclRange": [
        "brick:Substance"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "conditional",
      "note": "Meter or point to a substance: what is metered, or what is sensed. Rule: on a meter, the substance becomes System.medium on the metering system, or a qualifier on the bus:measures edge; on a point it is part of the point's meaning and becomes a classification plus the PropertyDefinition. It is NOT Relationship.medium — that is hasInputSubstance and hasOutputSubstance."
    },
    {
      "source": "brick:hasTag",
      "shaclDomain": [
        "owl:Class"
      ],
      "shaclRange": [
        "brick:Tag"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": "brick:isTagOf",
      "busPredicate": null,
      "fidelity": "conditional",
      "note": "Instance to tag. Reaches BUS as a classification with system 'brick-tag'; see classificationRule.",
      "busConstruct": "Entity.classifications"
    },
    {
      "source": "brick:hasUnit",
      "shaclDomain": [
        "brick:Point",
        "bsh:Active_EnergyQuantityShape",
        "bsh:Alternating_Current_FrequencyQuantityShape",
        "bsh:Ammonia_ConcentrationQuantityShape",
        "bsh:Apparent_EnergyQuantityShape",
        "bsh:AreaShape",
        "bsh:AzimuthShape",
        "bsh:CO2_ConcentrationQuantityShape",
        "bsh:CO_ConcentrationQuantityShape",
        "bsh:CloudageQuantityShape",
        "bsh:CoolingCapacityShape",
        "bsh:Current_AngleQuantityShape",
        "bsh:Current_ImbalanceQuantityShape",
        "bsh:Current_Total_Harmonic_DistortionQuantityShape",
        "bsh:Differential_CO2_ConcentrationQuantityShape",
        "bsh:Differential_CO_ConcentrationQuantityShape",
        "bsh:Differential_Dynamic_PressureQuantityShape",
        "bsh:Differential_Static_PressureQuantityShape",
        "bsh:Differential_TemperatureQuantityShape",
        "bsh:Dry_Bulb_TemperatureQuantityShape",
        "bsh:EfficiencyShape",
        "bsh:Electric_EnergyQuantityShape",
        "bsh:Formaldehyde_ConcentrationQuantityShape",
        "bsh:GrainsOfMoistureQuantityShape",
        "bsh:LevelQuantityShape",
        "bsh:Linear_SpeedQuantityShape",
        "bsh:Methane_ConcentrationQuantityShape",
        "bsh:NO2_ConcentrationQuantityShape",
        "bsh:Occupancy_PercentageQuantityShape",
        "bsh:Operative_TemperatureQuantityShape",
        "bsh:Ozone_ConcentrationQuantityShape",
        "bsh:PM10_ConcentrationQuantityShape",
        "bsh:PM1_ConcentrationQuantityShape",
        "bsh:PM2.5_ConcentrationQuantityShape",
        "bsh:Phasor_AngleQuantityShape",
        "bsh:Phasor_MagnitudeQuantityShape",
        "bsh:PositionQuantityShape",
        "bsh:PrecipitationQuantityShape",
        "bsh:Radiant_TemperatureQuantityShape",
        "bsh:Radon_ConcentrationQuantityShape",
        "bsh:Reactive_EnergyQuantityShape",
        "bsh:Rotational_SpeedQuantityShape",
        "bsh:Solar_IrradianceQuantityShape",
        "bsh:Solar_RadianceQuantityShape",
        "bsh:SpeedQuantityShape",
        "bsh:TVOC_ConcentrationQuantityShape",
        "bsh:TemperatureCoefficientPerDegreeCelsiusShape",
        "bsh:TemperatureShape",
        "bsh:ThermalTransmittanceShape",
        "bsh:TiltShape",
        "bsh:Voltage_AngleQuantityShape",
        "bsh:Voltage_ImbalanceQuantityShape",
        "bsh:VolumeQuantityShape",
        "bsh:VolumeShape",
        "bsh:Wet_Bulb_TemperatureQuantityShape",
        "bsh:Wind_DirectionQuantityShape"
      ],
      "shaclRange": [
        "qudt:Unit"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "conditional",
      "note": "Point to a qudt:Unit IRI. Becomes Point.unitCode, with unitSystem 'qudt' where no BUS code matches. See unitMap; note Brick does not inline the QUDT vocabularies, so a unit cannot be resolved to a symbol from the shipped file alone.",
      "busConstruct": "Point.unitCode"
    },
    {
      "source": "brick:isAssociatedWith",
      "shaclDomain": [
        "brick:Tag"
      ],
      "shaclRange": [
        "owl:Class"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": "brick:hasAssociatedTag",
      "busPredicate": null,
      "fidelity": "none",
      "note": "The inverse of hasAssociatedTag. Vocabulary level.",
      "level": "vocabulary"
    },
    {
      "source": "brick:isFedBy",
      "shaclDomain": [
        "brick:Location"
      ],
      "shaclRange": [
        "brick:Equipment"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": "brick:feeds",
      "busPredicate": "bus:fedBy",
      "fidelity": "conditional",
      "note": "As brick:feeds, R8 applies. Note the asymmetry in Brick's own SHACL: feeds has a 3-class domain and no range, isFedBy has domain brick:Location and range brick:Equipment. Neither constrains the other's endpoints, so an importer MUST NOT infer endpoint types from the predicate.",
      "mediumSatisfiable": false,
      "mediumSource": "nodeSubstance"
    },
    {
      "source": "brick:isLocationOf",
      "shaclDomain": [
        "brick:Location"
      ],
      "shaclRange": [
        "brick:Entity"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": "brick:hasLocation",
      "busPredicate": "bus:hasLocation",
      "fidelity": "conditional",
      "note": "The inverse. BUS names the inverse of bus:locatedIn 'bus:hasLocation', which reads backwards but is the declared pair.",
      "alternatePredicates": [
        "bus:contains"
      ]
    },
    {
      "source": "brick:isMeteredBy",
      "shaclDomain": [
        "brick:Collection",
        "brick:Equipment",
        "brick:Location",
        "bsh:MeterRelationshipRule",
        "rec:Architecture"
      ],
      "shaclRange": [
        "brick:Meter"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": "brick:meters",
      "busPredicate": "bus:measuredBy",
      "fidelity": "conditional",
      "note": "The inverse of brick:meters, with the same 9.3 problem: the object is a meter asset, not a point.",
      "alternatePredicates": [
        "bus:references"
      ]
    },
    {
      "source": "brick:isPartOf",
      "shaclDomain": [
        "brick:Equipment",
        "brick:Location"
      ],
      "shaclRange": [],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": "brick:hasPart",
      "busPredicate": "bus:partOf",
      "fidelity": "conditional",
      "note": "The inverse, with the same three-way branch.",
      "alternatePredicates": [
        "bus:containedIn",
        "bus:memberOf",
        "bus:contains"
      ]
    },
    {
      "source": "brick:isPointOf",
      "shaclDomain": [
        "brick:Point",
        "brick:Radiant_Panel_Temperature_Sensor"
      ],
      "shaclRange": [
        "brick:Radiant_Panel"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": "brick:hasPoint",
      "busPredicate": "bus:partOf",
      "fidelity": "conditional",
      "note": "The inverse.",
      "alternatePredicates": [
        "bus:containedIn"
      ]
    },
    {
      "source": "brick:isReplacedBy",
      "shaclDomain": [
        "brick:Entity"
      ],
      "shaclRange": [
        "brick:Entity"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": "bus:replacedBy",
      "fidelity": "conditional",
      "note": "At the instance level this is BUS's lifecycle succession, and Requirement 9.3-1 forbids deleting either endpoint. In Brick 1.4.4 all 240 uses are on vocabulary terms, not instances — see the deprecation block.",
      "level": "both"
    },
    {
      "source": "brick:isSubMeterOf",
      "shaclDomain": [
        "brick:Meter"
      ],
      "shaclRange": [
        "brick:Meter"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": "brick:hasSubMeter",
      "busPredicate": "bus:subMeterOf",
      "fidelity": "exact",
      "note": "The inverse."
    },
    {
      "source": "brick:isTagOf",
      "shaclDomain": [
        "brick:Tag"
      ],
      "shaclRange": [],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": "brick:hasTag",
      "busPredicate": null,
      "fidelity": "none",
      "note": "The inverse of hasTag.",
      "level": "vocabulary"
    },
    {
      "source": "brick:latitude",
      "shaclDomain": [
        "brick:Entity",
        "bsh:CoordinateShape"
      ],
      "shaclRange": [],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "exact",
      "note": "Becomes GeoPoint.lat on Building.geo or Space.geo.",
      "busConstruct": "GeoPoint.lat"
    },
    {
      "source": "brick:longitude",
      "shaclDomain": [
        "brick:Entity",
        "bsh:CoordinateShape"
      ],
      "shaclRange": [],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "exact",
      "note": "Becomes GeoPoint.lon on Building.geo or Space.geo.",
      "busConstruct": "GeoPoint.lon"
    },
    {
      "source": "brick:meters",
      "shaclDomain": [
        "brick:Building_Meter",
        "brick:Meter",
        "bsh:MeterRelationshipRule"
      ],
      "shaclRange": [],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": "brick:isMeteredBy",
      "busPredicate": "bus:measures",
      "fidelity": "conditional",
      "note": "Meter to the thing metered. BUS 9.3 requires the SUBJECT OF bus:measures TO BE A POINT, and Brick's meters has domain brick:Meter, which is equipment. Rule: where the meter has a register point through hasPoint, emit bus:measures from that point; where it does not, the importer MUST NOT emit bus:measures from the asset — it emits bus:references with a qualifier naming brick:meters, and declares the relationships domain partial. This is the single most common way a naive Brick import produces a package that validates against the schema and fails conformance group PK.",
      "alternatePredicates": [
        "bus:references"
      ]
    },
    {
      "source": "brick:timestamp",
      "shaclDomain": [
        "brick:Entity",
        "bsh:LastKnownBooleanShape",
        "bsh:LastKnownDoubleShape",
        "bsh:LastKnownDurationShape",
        "bsh:LastKnownIntegerShape",
        "bsh:LastKnownValueShape"
      ],
      "shaclRange": [
        "xsd:dateTime"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "none",
      "note": "The time of a last-known value. BUS packages carry the declaration that history exists (8.8), not values or their timestamps."
    },
    {
      "source": "brick:value",
      "shaclDomain": [
        "bsh:Active_EnergyQuantityShape",
        "bsh:Alternating_Current_FrequencyQuantityShape",
        "bsh:Ammonia_ConcentrationQuantityShape",
        "bsh:Apparent_EnergyQuantityShape",
        "bsh:AreaShape",
        "bsh:AzimuthShape",
        "bsh:BuildingPrimaryFunctionShape",
        "bsh:CO2_ConcentrationQuantityShape",
        "bsh:CO_ConcentrationQuantityShape",
        "bsh:CloudageQuantityShape",
        "bsh:CoolingCapacityShape",
        "bsh:CurrentFlowTypeShape",
        "bsh:Current_AngleQuantityShape",
        "bsh:Current_ImbalanceQuantityShape",
        "bsh:Current_Total_Harmonic_DistortionQuantityShape",
        "bsh:Differential_CO2_ConcentrationQuantityShape",
        "bsh:Differential_CO_ConcentrationQuantityShape",
        "bsh:Differential_Dynamic_PressureQuantityShape",
        "bsh:Differential_Static_PressureQuantityShape",
        "bsh:Differential_TemperatureQuantityShape",
        "bsh:Dry_Bulb_TemperatureQuantityShape",
        "bsh:EfficiencyShape",
        "bsh:ElectricVehicleChargingDirectionalityShape",
        "bsh:ElectricVehicleChargingTypeShape",
        "bsh:ElectricVehicleConnectorTypeShape",
        "bsh:Electric_EnergyQuantityShape",
        "bsh:ElectricalComplexPowerShape",
        "bsh:ElectricalFlowShape",
        "bsh:Formaldehyde_ConcentrationQuantityShape",
        "bsh:GrainsOfMoistureQuantityShape",
        "bsh:LastKnownBooleanShape",
        "bsh:LastKnownDoubleShape",
        "bsh:LastKnownDurationShape",
        "bsh:LastKnownIntegerShape",
        "bsh:LastKnownValueShape",
        "bsh:LevelQuantityShape",
        "bsh:Linear_SpeedQuantityShape",
        "bsh:Methane_ConcentrationQuantityShape",
        "bsh:NO2_ConcentrationQuantityShape",
        "bsh:Occupancy_PercentageQuantityShape",
        "bsh:Operative_TemperatureQuantityShape",
        "bsh:Ozone_ConcentrationQuantityShape",
        "bsh:PM10_ConcentrationQuantityShape",
        "bsh:PM1_ConcentrationQuantityShape",
        "bsh:PM2.5_ConcentrationQuantityShape",
        "bsh:PhaseCountShape",
        "bsh:PhasesShape",
        "bsh:Phasor_AngleQuantityShape",
        "bsh:Phasor_MagnitudeQuantityShape",
        "bsh:PositionQuantityShape",
        "bsh:PrecipitationQuantityShape",
        "bsh:Radiant_TemperatureQuantityShape",
        "bsh:Radon_ConcentrationQuantityShape",
        "bsh:Reactive_EnergyQuantityShape",
        "bsh:ResolutionShape",
        "bsh:Rotational_SpeedQuantityShape",
        "bsh:Solar_IrradianceQuantityShape",
        "bsh:Solar_RadianceQuantityShape",
        "bsh:SpeedQuantityShape",
        "bsh:StageShape",
        "bsh:TVOC_ConcentrationQuantityShape",
        "bsh:TemperatureCoefficientPerDegreeCelsiusShape",
        "bsh:TemperatureShape",
        "bsh:ThermalTransmittanceShape",
        "bsh:TiltShape",
        "bsh:VirtualMeterShape",
        "bsh:Voltage_AngleQuantityShape",
        "bsh:Voltage_ImbalanceQuantityShape",
        "bsh:VolumeQuantityShape",
        "bsh:VolumeShape",
        "bsh:Wet_Bulb_TemperatureQuantityShape",
        "bsh:Wind_DirectionQuantityShape",
        "bsh:YearBuiltShape",
        "rdfs:Resource"
      ],
      "shaclRange": [
        "rdfs:Resource",
        "xsd:boolean",
        "xsd:double",
        "xsd:duration",
        "xsd:integer",
        "xsd:nonNegativeInteger"
      ],
      "rdfsDomain": [],
      "rdfsRange": [],
      "inverseOf": null,
      "busPredicate": null,
      "fidelity": "none",
      "note": "A live or last-known value. Out of scope: a package describes a building, not its current state (5.2)."
    }
  ],
  "classificationRule": {
    "system": "brick",
    "version": "1.4.4",
    "systemTokenIsNormative": true,
    "additionalSystemTokens": [
      {
        "system": "rec",
        "version": null,
        "when": "The class is deprecated with a replacement in the rec: namespace.",
        "note": "version omitted: the shipped file states no REC version. See deprecation.recVersionCaveat."
      },
      {
        "system": "brick-tag",
        "version": "1.4.4",
        "when": "The instance carries brick:hasTag.",
        "note": "A separate token because tag: is a separate namespace with its own 533 individuals, none of which carries a definition. Spelling them 'brick' would make two different vocabularies collide in one system token."
      }
    ],
    "codeForm": "The CURIE exactly as Brick spells it: 'brick:Chilled_Water_System', 'rec:Room', 'tag:Discharge'. Not the full IRI, not the rdfs:label, not the underscore-stripped name. The prefix is part of the code because the same crosswalk emits three namespaces.",
    "labelForm": "rdfs:label where present. OPTIONAL.",
    "rules": [
      "R1. An exporter MUST emit one classification per asserted rdf:type in the brick: namespace, with system 'brick' and version '1.4.4'.",
      "R2. Where the class is deprecated AND carries brick:isReplacedBy, the exporter MUST emit the replacement as a second classification, with system 'rec' where the replacement is in the rec: namespace and 'brick' where it is in brick:. It MUST NOT emit the replacement instead of the original: the original is what the source graph actually said, and 7.7-1 forbids translating.",
      "R3. classification.version MUST be omitted on a rec: code. The shipped Brick distribution states no REC version, and inventing one is worse than omitting it.",
      "R4. Superclasses MUST NOT be emitted as additional classifications. The asserted type is the assertion; the ancestry belongs in abstractTypes (8.2), which is BUS's mechanism for exactly this and is not a classification.",
      "R5. Tags asserted with brick:hasTag are emitted with system 'brick-tag'. Tags reachable only through the class, via brick:hasAssociatedTag, MUST NOT be emitted: they are ontology content, not instance data, and emitting them would put 1249 classes' worth of derived tags into packages that never asserted them.",
      "R6. An importer MUST NOT deduplicate the brick: code against the rec: code. They are different vocabularies making the same claim, and a receiver may recognize either."
    ],
    "workedExamples": [
      {
        "sourceClass": "brick:Chilled_Water_System",
        "deprecated": false,
        "classificationsEmitted": [
          {
            "system": "brick",
            "version": "1.4.4",
            "code": "brick:Chilled_Water_System",
            "label": "Chilled Water System"
          }
        ],
        "comment": "A live class. One classification."
      },
      {
        "sourceClass": "brick:Ablutions_Room",
        "deprecated": true,
        "deprecatedInVersion": "1.4.0",
        "classificationsEmitted": [
          {
            "system": "brick",
            "version": "1.4.4",
            "code": "brick:Ablutions_Room",
            "label": "Ablutions Room"
          },
          {
            "system": "rec",
            "code": "rec:Room"
          }
        ],
        "comment": "A deprecated class with a rec: replacement. Two classifications, the second with no version."
      }
    ]
  },
  "deprecation": {
    "summary": "185 of Brick 1.4.4's 1433 classes are deprecated, 184 of them carrying a replacement: 112 into the rec: namespace and 72 within brick:. The whole of the Location branch — 109 classes — is deprecated in favour of rec:, which is to say Brick has delegated its spatial vocabulary to another ontology.",
    "counts": {
      "classes": 1433,
      "deprecatedClasses": 185,
      "deprecatedWithReplacement": 184,
      "replacementInRecNamespace": 112,
      "replacementInBrickNamespace": 72,
      "deprecatedWithNoReplacement": 1,
      "locationConeSize": 109,
      "locationConeDeprecated": 109,
      "recClassesInShippedFile": 268
    },
    "locationBranch": [
      {
        "source": "brick:Building",
        "coneSize": 2,
        "deprecated": true,
        "deprecatedInVersion": "1.4.0",
        "isReplacedBy": [
          "rec:Building"
        ]
      },
      {
        "source": "brick:Floor",
        "coneSize": 4,
        "deprecated": true,
        "deprecatedInVersion": "1.4.0",
        "isReplacedBy": [
          "rec:Level"
        ]
      },
      {
        "source": "brick:Outdoor_Area",
        "coneSize": 4,
        "deprecated": true,
        "deprecatedInVersion": "1.4.0",
        "isReplacedBy": [
          "rec:OutdoorSpace"
        ]
      },
      {
        "source": "brick:Outside",
        "coneSize": 1,
        "deprecated": true,
        "deprecatedInVersion": "1.4.1",
        "isReplacedBy": [
          "rec:OutdoorSpace"
        ]
      },
      {
        "source": "brick:Region",
        "coneSize": 1,
        "deprecated": true,
        "deprecatedInVersion": "1.4.0",
        "isReplacedBy": [
          "rec:Region"
        ]
      },
      {
        "source": "brick:Site",
        "coneSize": 1,
        "deprecated": true,
        "deprecatedInVersion": "1.4.0",
        "isReplacedBy": [
          "rec:Site"
        ]
      },
      {
        "source": "brick:Space",
        "coneSize": 88,
        "deprecated": true,
        "deprecatedInVersion": "1.4.0",
        "isReplacedBy": [
          "rec:Space"
        ]
      },
      {
        "source": "brick:Storey",
        "coneSize": 1,
        "deprecated": true,
        "deprecatedInVersion": "1.4.0",
        "isReplacedBy": [
          "rec:Level"
        ]
      },
      {
        "source": "brick:Wing",
        "coneSize": 1,
        "deprecated": true,
        "deprecatedInVersion": "1.4.1",
        "isReplacedBy": [
          "rec:Wing"
        ]
      },
      {
        "source": "brick:Zone",
        "coneSize": 5,
        "deprecated": true,
        "deprecatedInVersion": "1.4.0",
        "isReplacedBy": [
          "rec:Zone"
        ]
      }
    ],
    "typingHazard": "In the shipped Brick.ttl the 268 rec: classes are typed rdfs:Class and sh:NodeShape. A query for '?c a owl:Class' in the rec: namespace returns zero. Any tool that discovers Brick's class hierarchy by asking for owl:Class — which is exactly how the 1,433 figure is produced — sees 109 deprecated location classes and none of the replacements. A crosswalk that targets rec: alone is therefore invisible to a conventional Brick consumer, and one that targets brick: alone hands the receiver a vocabulary its own publisher has abandoned.",
    "rule": "Emit both. 7.7 permits an entity to carry any number of classifications including several from one system and several a receiver considers inconsistent, and it does not adjudicate between them. The deprecated brick: code is stable, resolvable, and correctly tells the receiver it holds a dead vocabulary; the rec: code is live. Emitting only one of the two is a choice the receiving system cannot undo. This is the clearest vindication of 5.3.3 in the whole exercise: because BUS never adopted a spatial taxonomy, Brick's mid-life abandonment of its own costs BUS nothing.",
    "recVersionCaveat": "The shipped Brick.ttl declares exactly one owl:Ontology, its own. The merged rec: classes carry no ontology declaration and no version. A conforming exporter therefore MUST omit classification.version on a rec: code rather than invent one or borrow Brick's — version is OPTIONAL in the schema for exactly this case — and SHOULD record the Brick distribution it read in provenance.source instead."
  },
  "portModel": {
    "status": "none",
    "finding": "Brick 1.4.4 has no port model. This was verified against the shipped ontology rather than assumed: there is no brick:hasPort, no brick:Port class and no brick:Connection class. brick:connectedTo exists and is a bare symmetric predicate with no SHACL domain, no range, no direction and no medium. The only Port terms in Brick are equipment classes.",
    "evidence": {
      "relationshipsMentioningPortOrConnection": [
        "brick:connectedTo"
      ],
      "classesWithPortInTheirName": [
        "brick:Electric_Vehicle_Charging_Port",
        "brick:Ethernet_Port"
      ],
      "connectedToShaclDomain": [],
      "connectedToShaclRange": [],
      "brickRelationshipsTotal": 37
    },
    "rule": "A BUS import from a Brick model MUST leave Asset.ports absent. There is nothing in the source to populate it from, and Asset.ports says in terms that an exporter which knows an asset's connection topology but not its port structure omits the array rather than inventing it. An importer MUST NOT synthesize a port from hasInputSubstance or hasOutputSubstance: those give a substance but no count, no name, no ordinal and no pairing, so a chiller would acquire exactly one chilled-water outlet whether it has one or four.",
    "priorArtNote": "The port prior art in the Brick distribution is extensions/223p.ttl (ASHRAE 223P), which is not in Brick.ttl's owl:imports and is not part of Brick 1.4.4 proper. BUS v0.3's Port, PortDirection, Port.pairedWith and Port.mapsTo follow 223P's ConnectionPoint, pairedConnectionPoint and mapsTo. A model that carries 223P alongside Brick can populate Asset.ports; a plain Brick model cannot."
  },
  "mediumMap": {
    "rule": "Brick's substances sit on the node, not on the edge: hasInputSubstance and hasOutputSubstance have SHACL domain brick:Equipment. A substance reaches Relationship.medium only through the R8 rule in predicateMap, and only when it is unambiguous. A substance whose fidelity is 'none' reaches BUS only as 'other'.",
    "busMediumValues": [
      "air",
      "water",
      "chilledWater",
      "hotWater",
      "condenserWater",
      "steam",
      "refrigerant",
      "electricity",
      "gas",
      "fuelOil",
      "data",
      "signal",
      "other"
    ],
    "substances": [
      {
        "source": "brick:Air",
        "label": "Air",
        "busMedium": "air",
        "fidelity": "exact"
      },
      {
        "source": "brick:Blowdown_Water",
        "label": "Blowdown Water",
        "busMedium": "water",
        "fidelity": "widening"
      },
      {
        "source": "brick:Building_Air",
        "label": "Building Air",
        "busMedium": "air",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Bypass_Air",
        "label": "Bypass Air",
        "busMedium": "air",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Bypass_Water",
        "label": "Bypass Water",
        "busMedium": "water",
        "fidelity": "widening"
      },
      {
        "source": "brick:CO",
        "label": "CO",
        "busMedium": "other",
        "fidelity": "none",
        "note": "A measured constituent, not a conveyed medium. Reaches BUS as a PropertyDefinition on the point, not as an edge medium."
      },
      {
        "source": "brick:CO2",
        "label": "CO2",
        "busMedium": "other",
        "fidelity": "none",
        "note": "As brick:CO."
      },
      {
        "source": "brick:Chilled_Water",
        "label": "Chilled Water",
        "busMedium": "chilledWater",
        "fidelity": "exact"
      },
      {
        "source": "brick:Collection_Basin_Water",
        "label": "Collection Basin Water",
        "busMedium": "water",
        "fidelity": "widening"
      },
      {
        "source": "brick:Condenser_Water",
        "label": "Condenser Water",
        "busMedium": "condenserWater",
        "fidelity": "exact"
      },
      {
        "source": "brick:Deionized_Water",
        "label": "Deionized Water",
        "busMedium": "water",
        "fidelity": "widening",
        "note": "Treatment state is lost."
      },
      {
        "source": "brick:Discharge_Air",
        "label": "Discharge Air",
        "busMedium": "air",
        "fidelity": "widening",
        "note": "Positional refinement lost. In BUS the position is the port, not the medium (9.4)."
      },
      {
        "source": "brick:Discharge_Chilled_Water",
        "label": null,
        "busMedium": "chilledWater",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Discharge_Condenser_Water",
        "label": null,
        "busMedium": "condenserWater",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Discharge_Hot_Water",
        "label": null,
        "busMedium": "hotWater",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Discharge_Water",
        "label": null,
        "busMedium": "water",
        "fidelity": "widening"
      },
      {
        "source": "brick:Domestic_Hot_Water",
        "label": "Domestic Hot Water",
        "busMedium": "water",
        "fidelity": "widening",
        "note": "Mapping to 'hotWater' would tell a receiver the loop serves space heating. 'water' plus the classification is the honest form."
      },
      {
        "source": "brick:Domestic_Water",
        "label": "Domestic Water",
        "busMedium": "water",
        "fidelity": "widening",
        "note": "Potability lost."
      },
      {
        "source": "brick:Entering_Chilled_Water",
        "label": "Entering Chilled Water",
        "busMedium": "chilledWater",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Entering_Condenser_Water",
        "label": "Entering Condenser Water",
        "busMedium": "condenserWater",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Entering_Hot_Water",
        "label": "Entering Hot Water",
        "busMedium": "hotWater",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Entering_Water",
        "label": "Entering Water",
        "busMedium": "water",
        "fidelity": "widening"
      },
      {
        "source": "brick:Exhaust_Air",
        "label": "Exhaust Air",
        "busMedium": "air",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Fluid",
        "label": "Fluid",
        "busMedium": "other",
        "fidelity": "none",
        "note": "A dimension of abstraction above the enum."
      },
      {
        "source": "brick:Frost",
        "label": "Frost",
        "busMedium": "other",
        "fidelity": "none",
        "note": "A condition, not a medium."
      },
      {
        "source": "brick:Fuel_Oil",
        "label": "Fuel Oil",
        "busMedium": "fuelOil",
        "fidelity": "exact"
      },
      {
        "source": "brick:Gas",
        "label": "Gas",
        "busMedium": "gas",
        "fidelity": "exact"
      },
      {
        "source": "brick:Gasoline",
        "label": "Gasoline",
        "busMedium": "other",
        "fidelity": "none",
        "note": "BUS has no medium for motor fuel."
      },
      {
        "source": "brick:Glycol",
        "label": "Glycol",
        "busMedium": "other",
        "fidelity": "none",
        "note": "A glycol loop is not water. BUS has no glycol medium and 'water' would misstate the fluid's freezing point, which is the reason the loop is glycol."
      },
      {
        "source": "brick:Hail",
        "label": "Hail",
        "busMedium": "other",
        "fidelity": "none",
        "note": "A weather phenomenon."
      },
      {
        "source": "brick:Hot_Water",
        "label": "Hot Water",
        "busMedium": "hotWater",
        "fidelity": "exact"
      },
      {
        "source": "brick:Ice",
        "label": "Ice",
        "busMedium": "other",
        "fidelity": "none",
        "note": "Thermal storage ice is water in another phase; BUS has no phase on the medium."
      },
      {
        "source": "brick:Leaving_Chilled_Water",
        "label": "Leaving Chilled Water",
        "busMedium": "chilledWater",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Leaving_Condenser_Water",
        "label": "Leaving Condenser Water",
        "busMedium": "condenserWater",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Leaving_Hot_Water",
        "label": "Leaving Hot Water",
        "busMedium": "hotWater",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Leaving_Water",
        "label": "Leaving Water",
        "busMedium": "water",
        "fidelity": "widening"
      },
      {
        "source": "brick:Light",
        "label": "Light",
        "busMedium": "other",
        "fidelity": "none",
        "note": "Not a conveyed substance."
      },
      {
        "source": "brick:Liquid",
        "label": "Liquid",
        "busMedium": "other",
        "fidelity": "none",
        "note": "A dimension of abstraction above the enum."
      },
      {
        "source": "brick:Liquid_CO2",
        "label": "Liquid CO2",
        "busMedium": "other",
        "fidelity": "none",
        "note": "A refrigerant in CO2 systems, but BUS 'refrigerant' names the working fluid role and Brick states the substance; an importer that knows it is the refrigerant circuit MAY use 'refrigerant' and MUST record the source term."
      },
      {
        "source": "brick:Makeup_Water",
        "label": "Makeup Water",
        "busMedium": "water",
        "fidelity": "widening"
      },
      {
        "source": "brick:Mixed_Air",
        "label": "Mixed Air",
        "busMedium": "air",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Natural_Gas",
        "label": "Natural Gas",
        "busMedium": "gas",
        "fidelity": "widening"
      },
      {
        "source": "brick:Oil",
        "label": "Oil",
        "busMedium": "other",
        "fidelity": "none",
        "note": "Generic oil spans fuel oil and lubricating oil. Mapping it to 'fuelOil' would assert a fuel that may not be one."
      },
      {
        "source": "brick:Outside_Air",
        "label": "Outside Air",
        "busMedium": "air",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Potable_Water",
        "label": "Potable Water",
        "busMedium": "water",
        "fidelity": "widening",
        "note": "Potability lost."
      },
      {
        "source": "brick:Refrigerant",
        "label": "Refrigerant",
        "busMedium": "refrigerant",
        "fidelity": "exact"
      },
      {
        "source": "brick:Return_Air",
        "label": "Return Air",
        "busMedium": "air",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Return_Condenser_Water",
        "label": null,
        "busMedium": "condenserWater",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Return_Hot_Water",
        "label": null,
        "busMedium": "hotWater",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Return_Water",
        "label": null,
        "busMedium": "water",
        "fidelity": "widening"
      },
      {
        "source": "brick:Soil",
        "label": "Soil",
        "busMedium": "other",
        "fidelity": "none",
        "note": "A ground-source medium with no BUS member."
      },
      {
        "source": "brick:Solid",
        "label": "Solid",
        "busMedium": "other",
        "fidelity": "none",
        "note": "A dimension of abstraction above the enum."
      },
      {
        "source": "brick:Steam",
        "label": "Steam",
        "busMedium": "steam",
        "fidelity": "exact"
      },
      {
        "source": "brick:Supply_Air",
        "label": "Supply Air",
        "busMedium": "air",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Supply_Chilled_Water",
        "label": null,
        "busMedium": "chilledWater",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Supply_Condenser_Water",
        "label": null,
        "busMedium": "condenserWater",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Supply_Hot_Water",
        "label": null,
        "busMedium": "hotWater",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      },
      {
        "source": "brick:Supply_Water",
        "label": null,
        "busMedium": "water",
        "fidelity": "widening"
      },
      {
        "source": "brick:Water",
        "label": "Water",
        "busMedium": "water",
        "fidelity": "exact"
      },
      {
        "source": "brick:Zone_Air",
        "label": "Zone Air",
        "busMedium": "air",
        "fidelity": "widening",
        "note": "Positional refinement lost."
      }
    ],
    "reachOnlyOther": [
      "brick:CO",
      "brick:CO2",
      "brick:Fluid",
      "brick:Frost",
      "brick:Gasoline",
      "brick:Glycol",
      "brick:Hail",
      "brick:Ice",
      "brick:Light",
      "brick:Liquid",
      "brick:Liquid_CO2",
      "brick:Oil",
      "brick:Soil",
      "brick:Solid"
    ],
    "positionalRefinementNote": "Brick draws positional distinctions inside the substance — Supply_Air, Return_Air, Mixed_Air, Entering_Chilled_Water, Leaving_Chilled_Water. In BUS the position is a property of the port, not of the medium (9.4), so these all widen onto the base medium. Where the model also supplies port structure (it does not, in Brick 1.4.4 — see portModel) the position would be recoverable; from Brick alone it survives only in the classification."
  },
  "unitMap": {
    "rule": "Brick carries a unit as brick:hasUnit to a qudt:Unit IRI. An importer MUST match the IRI against the table below, MUST NOT convert the value (7.4-1), and where no BUS code matches MUST set unitSystem 'qudt' and carry the QUDT IRI verbatim in unitCode (7.4).",
    "resolutionHazard": "Brick owl:imports the QUDT unit and quantitykind vocabularies by IRI and does not inline them, so the shipped file contains no unit label, symbol or conversion factor. A BUS importer cannot resolve a QUDT unit from a Brick file alone; it must fetch QUDT 3.1.8 separately. Two importers resolving against different QUDT versions can produce different BUS unit codes from the same Brick graph, which is why this table is pinned to the QUDT version Brick imports.",
    "qudtVersionImported": [
      "http://qudt.org/3.1.8/vocab/quantitykind",
      "http://qudt.org/3.1.8/vocab/unit"
    ],
    "busUnitsFileCarriesPerUnitQudt": false,
    "busUnitsFileNote": "bus-units.json carries a per-unit 'ucum' field only; its externalSystems block names qudt as an escape system but no per-unit QUDT code exists. This file supplies that column, for the units Brick actually references.",
    "referencedQudtUnits": 205,
    "referencedQudtUnitsNote": "The QUDT units Brick names anywhere in the shipped file: the qudt:applicableUnit lists on its 52 quantity concepts and the sh:in allowed-unit lists on its entity properties. Instance data may use any QUDT unit at all, so absence from this list is not absence from QUDT — it only means Brick's own vocabulary never mentions it.",
    "qudtToBus": [
      {
        "qudtUnit": "unit:BAR",
        "busCode": "bar",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:BTU_IT",
        "busCode": "Btu",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:BTU_IT-PER-HR",
        "busCode": "Btu/h",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:BTU_TH-PER-HR",
        "busCode": "Btu/h",
        "fidelity": "widening",
        "note": "The thermochemical Btu differs from the international-table Btu by about six parts in ten thousand. BUS has one Btu/h and 7.4-1 forbids converting, so the distinction is lost and the importer MUST record the source unit IRI."
      },
      {
        "qudtUnit": "unit:DEG",
        "busCode": "deg",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:DEG_C",
        "busCode": "degC",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:DEG_F",
        "busCode": "degF",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:FT",
        "busCode": "ft",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:FT2",
        "busCode": "ft2",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:FT3",
        "busCode": "ft3",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:HZ",
        "busCode": "Hz",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:IN",
        "busCode": "in",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:IN_H2O",
        "busCode": "inH2O",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:IN_H2O_39dot2DEG_F",
        "busCode": "inH2O",
        "fidelity": "widening",
        "note": "The reference temperature is lost; BUS has one inH2O."
      },
      {
        "qudtUnit": "unit:IN_H2O_60DEG_F",
        "busCode": "inH2O",
        "fidelity": "widening",
        "note": "The reference temperature is lost."
      },
      {
        "qudtUnit": "unit:IN_HG",
        "busCode": "inHg",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:IN_HG_32DEG_F",
        "busCode": "inHg",
        "fidelity": "widening",
        "note": "The reference temperature is lost."
      },
      {
        "qudtUnit": "unit:IN_HG_60DEG_F",
        "busCode": "inHg",
        "fidelity": "widening",
        "note": "The reference temperature is lost."
      },
      {
        "qudtUnit": "unit:J",
        "busCode": "J",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:K",
        "busCode": "K",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:KiloPA",
        "busCode": "kPa",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:KiloW-HR",
        "busCode": "kWh",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:L",
        "busCode": "L",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:M",
        "busCode": "m",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:M-PER-SEC",
        "busCode": "m/s",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:M2",
        "busCode": "m2",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:M3",
        "busCode": "m3",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:MegaW-HR",
        "busCode": "MWh",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:MicroGM-PER-M3",
        "busCode": "ug/m3",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:MilliM",
        "busCode": "mm",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:PA",
        "busCode": "Pa",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:PERCENT",
        "busCode": "pct",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:PPB",
        "busCode": "ppb",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:PPM",
        "busCode": "ppm",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:PSI",
        "busCode": "psi",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:RAD",
        "busCode": "rad",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:TON_FG",
        "busCode": "tonRef",
        "fidelity": "conditional",
        "note": "Identified as the refrigeration ton from its context: it is one of the four allowed units on brick:coolingCapacity alongside unit:W and unit:BTU_IT-PER-HR. Brick imports the QUDT vocabularies by IRI and does not inline them, so no label is available in the shipped file to confirm it. An importer MUST verify against QUDT 3.1.8 before relying on this row."
      },
      {
        "qudtUnit": "unit:W",
        "busCode": "W",
        "fidelity": "exact"
      },
      {
        "qudtUnit": "unit:W-HR",
        "busCode": "Wh",
        "fidelity": "exact"
      }
    ],
    "qudtUnitsWithNoBusCode": [
      "unit:AC-FT",
      "unit:AC-FT_US",
      "unit:ANGSTROM3",
      "unit:ARCMIN",
      "unit:ARCSEC",
      "unit:ATM",
      "unit:ATM_T",
      "unit:BARAD",
      "unit:BARYE",
      "unit:BAR_A",
      "unit:BBL",
      "unit:BBL_UK_PET",
      "unit:BFT",
      "unit:BQ-PER-M3",
      "unit:BU_US_DRY",
      "unit:CentiBAR",
      "unit:CentiM",
      "unit:CentiM3",
      "unit:CentiM_H2O",
      "unit:CentiM_H2O_4DEG_C",
      "unit:CentiM_HG",
      "unit:CentiM_HG_0DEG_C",
      "unit:DEG-PER-HR",
      "unit:DEG-PER-MIN",
      "unit:DEG-PER-SEC",
      "unit:DEG_C_GROWING_CEREAL",
      "unit:DEG_R",
      "unit:DYN-PER-CentiM2",
      "unit:DecaK",
      "unit:DecaL",
      "unit:DecaM3",
      "unit:DecaPA",
      "unit:DeciBAR",
      "unit:DeciB_M",
      "unit:DeciL",
      "unit:DeciM",
      "unit:DeciM3",
      "unit:FBM",
      "unit:FT-PER-HR",
      "unit:FT-PER-SEC",
      "unit:FT3-PER-MIN-FT2",
      "unit:FT_H2O",
      "unit:FT_H2O_39dot2DEG_F",
      "unit:FT_HG",
      "unit:FemtoL",
      "unit:GI_UK",
      "unit:GI_US",
      "unit:GM_F-PER-CentiM2",
      "unit:GON",
      "unit:GRAD",
      "unit:GRAIN",
      "unit:GT",
      "unit:GigaHZ",
      "unit:GigaHZ-M",
      "unit:GigaPA",
      "unit:HZ-M",
      "unit:HectoBAR",
      "unit:HectoL",
      "unit:HectoPA",
      "unit:IN-PER-YR",
      "unit:IN3",
      "unit:KIP_F-PER-IN2",
      "unit:KiloBAR",
      "unit:KiloCubicFT",
      "unit:KiloGM-PER-M-SEC2",
      "unit:KiloGM_F-PER-CentiM2",
      "unit:KiloGM_F-PER-M2",
      "unit:KiloGM_F-PER-MilliM2",
      "unit:KiloHZ",
      "unit:KiloL",
      "unit:KiloLB_F-PER-IN2",
      "unit:KiloM",
      "unit:KiloM-PER-HR",
      "unit:KiloM-PER-SEC",
      "unit:KiloN-PER-CentiM2",
      "unit:KiloN-PER-M2",
      "unit:KiloN-PER-MilliM2",
      "unit:KiloPA_A",
      "unit:KiloV-A-HR",
      "unit:KiloV-A_Reactive-HR",
      "unit:LB_F-PER-FT2",
      "unit:LB_F-PER-IN2",
      "unit:M-PER-HR",
      "unit:MI-PER-HR",
      "unit:MI-PER-SEC",
      "unit:MI3",
      "unit:MIL",
      "unit:MIL_Angle",
      "unit:MIN_Angle",
      "unit:MI_UK3",
      "unit:M_H2O",
      "unit:MegaBAR",
      "unit:MegaHZ",
      "unit:MegaHZ-M",
      "unit:MegaK",
      "unit:MegaL",
      "unit:MegaN-PER-M2",
      "unit:MegaPA",
      "unit:MegaPSI",
      "unit:MegaV-A-HR",
      "unit:MegaV-A_Reactive-HR",
      "unit:MicroATM",
      "unit:MicroBAR",
      "unit:MicroL",
      "unit:MicroM",
      "unit:MicroM-PER-MIN",
      "unit:MicroM-PER-SEC",
      "unit:MicroM3",
      "unit:MicroPA",
      "unit:MicroRAD",
      "unit:MicroTORR",
      "unit:MilliARCSEC",
      "unit:MilliBAR",
      "unit:MilliBAR_A",
      "unit:MilliDEG_C",
      "unit:MilliK",
      "unit:MilliL",
      "unit:MilliM3",
      "unit:MilliM_H2O",
      "unit:MilliM_HG",
      "unit:MilliM_HGA",
      "unit:MilliPA",
      "unit:MilliRAD",
      "unit:MilliTORR",
      "unit:N-PER-CentiM2",
      "unit:N-PER-M2",
      "unit:N-PER-MilliM2",
      "unit:NT",
      "unit:NanoL",
      "unit:OKTA",
      "unit:OZ_VOL_UK",
      "unit:PDL-PER-FT2",
      "unit:PDL-PER-IN2",
      "unit:PINT",
      "unit:PINT_UK",
      "unit:PK_UK",
      "unit:PicoL",
      "unit:PicoPA",
      "unit:PlanckPressure",
      "unit:PlanckTemperature",
      "unit:PlanckVolume",
      "unit:QT_UK",
      "unit:QT_US",
      "unit:RAD-PER-HR",
      "unit:RAD-PER-MIN",
      "unit:RAD-PER-SEC",
      "unit:REV",
      "unit:RT",
      "unit:STANDARD",
      "unit:STR",
      "unit:TBSP",
      "unit:TON_Register",
      "unit:TON_SHIPPING_UK",
      "unit:TON_SHIPPING_US",
      "unit:TORR",
      "unit:TSP",
      "unit:V-A-HR",
      "unit:V-A_Reactive-HR",
      "unit:W-PER-M2",
      "unit:W-PER-M2-K",
      "unit:W-PER-M2-SR",
      "unit:YD",
      "unit:YD-PER-HR",
      "unit:YD-PER-MIN",
      "unit:YD-PER-SEC",
      "unit:YD3"
    ],
    "busCodesNotReachableFromBrickVocabulary": [
      "A",
      "L/s",
      "MBtu/h",
      "MJ",
      "MW",
      "V",
      "cfm",
      "count",
      "dB",
      "dBA",
      "day",
      "deltaDegC",
      "deltaDegF",
      "fc",
      "fpm",
      "gPerKg",
      "gal",
      "gpm",
      "grPerLb",
      "h",
      "hp",
      "kVA",
      "kVAR",
      "kW",
      "kg",
      "kg/s",
      "lb",
      "lb/h",
      "lux",
      "m3/h",
      "m3/s",
      "mg/m3",
      "min",
      "ms",
      "ohm",
      "pctRH",
      "pf",
      "ratio",
      "rpm",
      "s",
      "therm",
      "tonHours",
      "yr"
    ]
  },
  "entityPropertyMap": [
    {
      "source": "brick:aggregate",
      "label": "Aggregate",
      "domain": [
        "brick:Point"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "How the series is rolled up. No BUS field; becomes a property."
    },
    {
      "source": "brick:area",
      "label": "Area",
      "domain": [
        "brick:Location"
      ],
      "busField": "Space.floorArea",
      "fidelity": "exact"
    },
    {
      "source": "brick:azimuth",
      "label": "Azimuth",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:buildingPrimaryFunction",
      "label": "Building primary function",
      "domain": [
        "brick:Building"
      ],
      "busField": "Building.primaryUse",
      "fidelity": "widening",
      "sourceEnumeratedValueCount": 86,
      "note": "Brick's 86 enumerated values onto a free string. The value is carried verbatim; the enumeration membership is lost."
    },
    {
      "source": "brick:buildingThermalTransmittance",
      "label": "Building thermal transmittance",
      "domain": [
        "brick:Building"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "As brick:thermalTransmittance."
    },
    {
      "source": "brick:conversionEfficiency",
      "label": "Conversion efficiency",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:coolingCapacity",
      "label": "Cooling capacity",
      "domain": [
        "brick:Chiller"
      ],
      "busField": "Asset.capacity",
      "fidelity": "conditional",
      "note": "Asset.capacity is BUS's only named rating. Where an asset carries more than one rating, only one can be capacity and the rest become properties."
    },
    {
      "source": "brick:coordinates",
      "label": "Coordinates",
      "domain": [
        "brick:Equipment",
        "brick:Location"
      ],
      "busField": "Space.geo",
      "fidelity": "conditional",
      "note": "A coordinate pair on Equipment or Location. BUS carries geo on Building and Space only; on an asset it becomes a property."
    },
    {
      "source": "brick:currentFlowType",
      "label": "Current flow type",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "sourceEnumeratedValueCount": 2,
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:deprecation",
      "label": "Deprecation Notice",
      "domain": [
        "brick:Entity"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "Vocabulary-term deprecation; see the deprecation block."
    },
    {
      "source": "brick:electricVehicleChargerDirectionality",
      "label": "has electric vehicle charger directionality",
      "domain": [
        "brick:Electric_Vehicle_Charging_Port",
        "brick:Electric_Vehicle_Charging_Station"
      ],
      "busField": null,
      "fidelity": "none",
      "sourceEnumeratedValueCount": 2,
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:electricVehicleChargerType",
      "label": "has electric vehicle charger type",
      "domain": [
        "brick:Electric_Vehicle_Charging_Station"
      ],
      "busField": null,
      "fidelity": "none",
      "sourceEnumeratedValueCount": 3,
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:electricVehicleConnectorType",
      "label": "has electric vehicle connector type",
      "domain": [
        "brick:Electric_Vehicle_Charging_Port"
      ],
      "busField": null,
      "fidelity": "none",
      "sourceEnumeratedValueCount": 9,
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:electricalComplexPower",
      "label": "electrical complex power type",
      "domain": [
        "brick:Equipment",
        "brick:Point"
      ],
      "busField": null,
      "fidelity": "none",
      "sourceEnumeratedValueCount": 3,
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:electricalFlow",
      "label": "Electrical flow direction",
      "domain": [
        "brick:Equipment",
        "brick:Point"
      ],
      "busField": null,
      "fidelity": "none",
      "sourceEnumeratedValueCount": 4,
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:electricalPhaseCount",
      "label": "Electrical phase count",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "sourceEnumeratedValueCount": 4,
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:electricalPhases",
      "label": "Electrical phases",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "sourceEnumeratedValueCount": 7,
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:grossArea",
      "label": "Gross area",
      "domain": [
        "brick:Location"
      ],
      "busField": "Building.grossArea",
      "fidelity": "conditional",
      "note": "On a Location. Where the location is the building, Building.grossArea; where it is a space, Space.floorArea with a property recording that it is gross."
    },
    {
      "source": "brick:isVirtualMeter",
      "label": "is virtual meter",
      "domain": [
        "brick:Meter"
      ],
      "busField": "Point.meterScope",
      "fidelity": "conditional",
      "note": "true maps to Point.meterScope 'virtual' on the meter's register point. false does not map to 'site' or 'submeter': those are a different axis, and an importer MUST NOT infer scope from the flag."
    },
    {
      "source": "brick:lastKnownValue",
      "label": "Last known value",
      "domain": [
        "brick:Absolute_Humidity_Sensor",
        "brick:Adjust_Sensor",
        "brick:Air_Grains_Sensor",
        "brick:Air_Quality_Sensor",
        "brick:Alarm",
        "brick:Angle_Sensor",
        "brick:Capacity_Sensor",
        "brick:Command",
        "brick:Conductivity_Sensor",
        "brick:Contact_Sensor",
        "brick:Current_Sensor",
        "brick:Demand_Sensor",
        "brick:Dewpoint_Sensor",
        "brick:Direction_Sensor",
        "brick:Duration_Sensor",
        "brick:Energy_Sensor",
        "brick:Enthalpy_Sensor",
        "brick:Fire_Sensor",
        "brick:Flow_Sensor",
        "brick:Frequency_Sensor",
        "brick:Frost_Sensor",
        "brick:Gas_Sensor",
        "brick:Generation_Sensor",
        "brick:Hail_Sensor",
        "brick:Heat_Sensor",
        "brick:Illuminance_Sensor",
        "brick:Imbalance_Sensor",
        "brick:Luminance_Sensor",
        "brick:Motion_Sensor",
        "brick:Occupancy_Count_Sensor",
        "brick:Occupancy_Sensor",
        "brick:Parameter",
        "brick:Piezoelectric_Sensor",
        "brick:Point",
        "brick:Position_Sensor",
        "brick:Power_Factor_Sensor",
        "brick:Power_Sensor",
        "brick:Pressure_Sensor",
        "brick:Rain_Level_Sensor",
        "brick:Refrigerant_Level_Sensor",
        "brick:Relative_Humidity_Sensor",
        "brick:Setpoint",
        "brick:Solar_Radiance_Sensor",
        "brick:Speed_Sensor",
        "brick:Status",
        "brick:Temperature_Sensor",
        "brick:Torque_Sensor",
        "brick:Usage_Sensor",
        "brick:Voltage_Sensor",
        "brick:Water_Level_Sensor",
        "bsh:OneLastKnownValuePerEntity"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "Live state. Out of scope (5.2)."
    },
    {
      "source": "brick:measuredModuleConversionEfficiency",
      "label": "Measured module conversion efficiency",
      "domain": [
        "brick:PV_Panel"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:measuredPowerInput",
      "label": "Measured power input",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:measuredPowerOutput",
      "label": "Measured power output",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:netArea",
      "label": "Net area",
      "domain": [
        "brick:Location"
      ],
      "busField": "Space.floorArea",
      "fidelity": "widening",
      "note": "BUS has one floorArea and does not distinguish gross from net on a space. Emitting both Brick values into one field would lose one; the second becomes a property (7.8)."
    },
    {
      "source": "brick:operationalStage",
      "label": "Operational stage",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "sourceEnumeratedValueCount": 4,
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:operationalStageCount",
      "label": "Operational stage count",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "sourceEnumeratedValueCount": 4,
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:panelArea",
      "label": "Panel area",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:ratedCurrentInput",
      "label": "Rated current input",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:ratedCurrentOutput",
      "label": "Rated current output",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:ratedMaximumCurrentInput",
      "label": "Rated maximum current input",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:ratedMaximumCurrentOutput",
      "label": "Rated maximum current output",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:ratedMaximumVoltageInput",
      "label": "Rated maximum voltage input",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:ratedMaximumVoltageOutput",
      "label": "Rated maximum voltage output",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:ratedMinimumCurrentInput",
      "label": "Rated minimum current input",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:ratedMinimumCurrentOutput",
      "label": "Rated minimum current output",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:ratedMinimumVoltageInput",
      "label": "Rated minimum voltage input",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:ratedMinimumVoltageOutput",
      "label": "Rated minimum voltage output",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:ratedModuleConversionEfficiency",
      "label": "Rated module conversion efficiency",
      "domain": [
        "brick:PV_Panel"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:ratedPowerInput",
      "label": "Rated power input",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:ratedPowerOutput",
      "label": "Rated power output",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:ratedVoltageInput",
      "label": "Measured voltage input",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:ratedVoltageOutput",
      "label": "Rated voltage output",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:resolution",
      "label": "Resolution",
      "domain": [
        "brick:Point"
      ],
      "busField": "Point.resolution",
      "fidelity": "exact"
    },
    {
      "source": "brick:temperatureCoefficientofPmax",
      "label": "Temperature coefficient",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:thermalTransmittance",
      "label": "Thermal transmittance",
      "domain": [
        "brick:Location"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No BUS field. A property against a declared PropertyDefinition (7.8)."
    },
    {
      "source": "brick:tilt",
      "label": "Tilt",
      "domain": [
        "brick:Equipment"
      ],
      "busField": null,
      "fidelity": "none",
      "note": "No named BUS field. Becomes a property value against a bus:PropertyDefinition the exporter declares (7.8). Requirement 7.8-1 makes the definition mandatory, so the meaning is not lost, but the shared vocabulary is: two exporters will mint two definitions for the same Brick term unless they agree out of band. This is the population 15.5 promotion exists to harvest."
    },
    {
      "source": "brick:volume",
      "label": "Volume",
      "domain": [
        "brick:Equipment",
        "brick:Location"
      ],
      "busField": "Space.volume",
      "fidelity": "conditional",
      "note": "On a Location, Space.volume; on Equipment there is no BUS field and it becomes a property."
    },
    {
      "source": "brick:yearBuilt",
      "label": "Year built",
      "domain": [
        "brick:Building"
      ],
      "busField": "Building.yearBuilt",
      "fidelity": "exact"
    }
  ],
  "unmappable": [
    {
      "source": "brick:Tag individuals",
      "sourceKind": "individual",
      "count": 533,
      "reason": "533 tag individuals, none of which carries a definition, plus a tag-to-class inference rule set shipped as a separate SHACL file that is not in the ontology. BUS has no tag vocabulary of any kind and does not infer. Tags reach a package only as verbatim classifications; the inference does not travel.",
      "busDisposition": "classifications with system 'brick-tag'; the inference rules are dropped"
    },
    {
      "source": "brick:hasAssociatedTag",
      "sourceKind": "relationship",
      "count": 1249,
      "reason": "Class-to-tag association on 1249 of the 1433 classes. Ontology content, not instance data.",
      "busDisposition": "dropped; classificationRule R5 forbids emitting derived tags"
    },
    {
      "source": "SHACL node shapes",
      "sourceKind": "shape",
      "count": 0,
      "reason": "Brick states domain and range in sh:property shapes on class node shapes, not in rdfs:domain and rdfs:range: not one of the 37 relationships carries either. Typing is therefore per-class, nothing is entailed, and a validating Brick graph is not a typed one. BUS states endpoint constraints in prose (9.3) and tests them in conformance group PK. The two enforcement models do not correspond: a BUS export that satisfies PK-8 may fail Brick's SHACL, and a Brick graph that passes SHACL may violate 9.3 by carrying no medium at all.",
      "busDisposition": "not carried; the constraint model is not portable in either direction"
    },
    {
      "source": "brick:deprecationMitigationRule",
      "sourceKind": "relationship",
      "count": 184,
      "reason": "A SHACL rule that rewrites a deprecated instance into its replacement. BUS has no rule language and declined one.",
      "busDisposition": "dropped; the deprecation block records the replacement mapping instead"
    },
    {
      "source": "qudt:hasDimensionVector on brick:Quantity",
      "sourceKind": "annotation",
      "count": 52,
      "reason": "Dimension vectors let a receiver check that two independently authored quantities are dimensionally compatible. BUS carries 28 quantity names as plain strings on unit rows with no dimension, no conversion factor and no entity identity (R13, deferred to a later version).",
      "busDisposition": "dropped; the quantity term survives as a classification on the PropertyDefinition"
    },
    {
      "source": "brick:Portfolio",
      "sourceKind": "class",
      "count": 1,
      "reason": "A collection of sites. A BUS package is scoped to one building and its manifest names one subject (16.2, 16.3), so a portfolio sits above the package boundary. Package chaining (16.9) is the nearest mechanism and it links packages, not buildings.",
      "busDisposition": "dropped; each building becomes its own package"
    },
    {
      "source": "brick:lastKnownValue, brick:value, brick:timestamp",
      "sourceKind": "entity property",
      "count": 3,
      "reason": "Live and last-known state. A BUS package describes a building, not its current values (5.2). This is a deliberate boundary, not a gap.",
      "busDisposition": "dropped"
    },
    {
      "source": "ref:TimeseriesReference and siblings",
      "sourceKind": "imported vocabulary",
      "count": 1,
      "reason": "Brick's ref: namespace has a proper external-reference model — ref:TimeseriesReference with ref:hasTimeseriesId and ref:storedAt, plus ref:BACnetReference and ref:IFCReference. BUS carries the declaration that history exists (8.8) and defers the timeSeries domain entirely (2.3), so the reference has nowhere to land. The BACnet and IFC identifiers do land, in externalIds (6.3).",
      "busDisposition": "timeseries references dropped and the timeSeries domain declared absent with reason deferredToLaterVersion; foreign identifiers preserved in externalIds"
    },
    {
      "source": "rec: classes in the merged distribution",
      "sourceKind": "imported vocabulary",
      "count": 268,
      "reason": "The shipped 'full' build merges rec:, ref: and bacnet:. Several rec: constructs — rec:Person, rec:Organization, rec:AlarmObject, rec:Event, rec:Geometry — do correspond to BUS classes, but they are not Brick, they are not owl:Class, and they carry no version in the shipped file. Mapping them here would make this a BUS-to-REC crosswalk under a Brick label.",
      "busDisposition": "out of scope for this file; the deprecation block maps only the Location replacements, which Brick itself points at"
    }
  ],
  "unmappableFromBus": [
    {
      "busConstruct": "bus:Objective, bus:Target, bus:Constraint",
      "reason": "No term anywhere in Brick for what a building is meant to achieve. brick:Setpoint and brick:Parameter are point classes: a stored value, not an intent."
    },
    {
      "busConstruct": "bus:Sequence and Sequence.deployment",
      "reason": "No sequence, program or logic construct in 1,433 classes. brick:aggregationFunction is about time-series rollups."
    },
    {
      "busConstruct": "bus:AlarmDefinition",
      "reason": "65 Alarm point classes, names only. Configuration exists only as separate alarm Parameter point classes — a delay is a point with a value, not a field of an alarm, which is the intent-stored-as-state failure 10.1 names. No routing, no acknowledgement policy, no priority."
    },
    {
      "busConstruct": "bus:Event",
      "reason": "Nothing in Brick proper. rec:Event and its four subtypes exist in the merged REC import with no event-kind enum and no override or release semantics."
    },
    {
      "busConstruct": "bus:KnowledgeNote",
      "reason": "No construct for a note about an instance. 449 classes and all 533 tags carry no definition even for the terms."
    },
    {
      "busConstruct": "Provenance on every assertion",
      "reason": "Nothing on Brick entities. rec:createdBy, rec:createdTime, rec:installedBy and rec:commissionedBy exist in the REC import; they are per-entity, not per-assertion, and carry no method or confidence. An import into BUS MUST synthesize provenance with method 'imported' because method is REQUIRED (14.1)."
    },
    {
      "busConstruct": "bus:Relationship as an entity",
      "reason": "A Brick relation is a triple. Reification, singleton properties and RDF-star are all available and none of the three is used anywhere in 1.4.4, and Brick declares no vocabulary for asserting anything about an edge. Exporting BUS relationships to Brick loses id, provenance, validFor, qualifiers, medium and both ports, and MUST declare the relationships domain partial with reason notSupportedByExporter (16.6)."
    },
    {
      "busConstruct": "Relationship.medium on the edge",
      "reason": "The R8 case in reverse. Brick can only put the substance on the node, so a BUS export of a chiller feeding two loops with two media cannot be written to Brick without losing which medium goes to which."
    },
    {
      "busConstruct": "Asset.ports",
      "reason": "See portModel: Brick has no port model at all."
    },
    {
      "busConstruct": "Clause 13 presentation model",
      "reason": "Nothing in Brick proper beyond latitude and longitude. The REC import brings space geometry with a georeference but no symbol, layer, element or data binding."
    },
    {
      "busConstruct": "The completeness declaration",
      "reason": "Brick has no package concept, so the question cannot be posed."
    },
    {
      "busConstruct": "Point.meterScope 'site' and 'submeter'",
      "reason": "Brick has brick:isVirtualMeter, which reaches meterScope 'virtual', and the hasSubMeter hierarchy, from which submeter status is inferable — but nothing that states a meter is the site's utility-grade meter."
    }
  ],
  "counts": {
    "entityTypesMapped": 56,
    "entityTypesReachingNoBusType": 6,
    "entityTypesByFidelity": {
      "conditional": 11,
      "exact": 12,
      "none": 6,
      "widening": 27
    },
    "sourceClassesCovered": 1431,
    "sourceClassesUncovered": 2,
    "predicatesMapped": 37,
    "predicatesReachingNoBusPredicate": 23,
    "predicatesWhereMediumIsNotSatisfiable": 3,
    "predicatesByFidelity": {
      "conditional": 20,
      "exact": 4,
      "none": 13
    },
    "portsMapped": 0,
    "mediumsMapped": 60,
    "mediumsReachingOnlyOther": 14,
    "entityPropertiesMapped": 48,
    "entityPropertiesWithNoBusField": 38,
    "unitCodesMapped": 39,
    "sourceUnitsWithNoBusCode": 166,
    "busUnitCodesNotReachable": 43,
    "deprecatedClasses": 185,
    "deprecatedClassesReplacedByRec": 112,
    "unmappableConstructs": 9,
    "busConstructsSourceCannotExpress": 12
  }
}
