{
  "busVersion": "0.3",
  "title": "BUS-1 v0.3 crosswalk: Project Haystack",
  "status": "PROVISIONAL. Normative for the classification, port, medium and unit 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 an equipment taxonomy onto a BUS taxonomy, because BUS has none by design (5.3.3) and external classifications travel verbatim (7.7). It states the rules that make two independent implementers exporting the same Haystack model produce the same BUS package.",
  "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": "Project Haystack",
    "version": "4.0.0",
    "repo": "https://github.com/Project-Haystack/haystack-defs.git",
    "commit": "d042781e7031c125332920c9800e3d04e8f16cf7",
    "commitDate": "2025-07-07T09:01:13-04:00",
    "commitSubject": "Build 4.0.0",
    "license": "Academic Free License 3.0",
    "libs": [
      "ph",
      "phIct",
      "phIoT",
      "phScience"
    ],
    "unitDatabase": {
      "database": "Fantom Unit Database (etc/sys/units.txt)",
      "repo": "https://github.com/fantom-lang/fantom.git",
      "commit": "b8c70f1d7c8239e67a9da994532f1353b4969302",
      "path": "etc/sys/units.txt",
      "note": "haystack-defs does not vendor units.txt; Project Haystack delegates the unit database to Fantom sys::Unit (see docHaystack::Units)."
    },
    "counts": {
      "defs": 719,
      "entityDefs": 142,
      "markers": 302,
      "conjuncts": 162,
      "choices": 98,
      "refValuedTags": 29,
      "relationshipDefs": 4,
      "portConjuncts": 28,
      "defsDeclaringAPort": 34,
      "defsWithMultipleSupertypes": 44,
      "defsWithAPortAmongTheirSupertypes": 34,
      "defsWhoseMultipleSupertypesAreOnlyAPort": 32,
      "protocolDefs": 18,
      "defsWithPrototypeChildren": 47,
      "substanceCone": 46,
      "units": 457,
      "unitQuantities": 60
    }
  },
  "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,
      "protocolTokens": 22
    }
  },
  "entityTypeMap": [
    {
      "source": "ac-elec-meter",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "ac-evse-port",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "actuator",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "elec-input"
      ]
    },
    {
      "source": "ahu",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "air-conditioning-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "hvac",
        "medium": "air"
      },
      "fidelity": "exact"
    },
    {
      "source": "air-exhaust-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "hvac",
        "medium": "air"
      },
      "fidelity": "exact"
    },
    {
      "source": "air-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "hvac",
        "medium": "air"
      },
      "fidelity": "exact"
    },
    {
      "source": "air-ventilation-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "hvac",
        "medium": "air"
      },
      "fidelity": "exact"
    },
    {
      "source": "airHandlingEquip",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "air-output",
        "elec-input"
      ]
    },
    {
      "source": "airQualityZonePoints",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Zone",
      "busFields": {
        "zoneKind": "other"
      },
      "fidelity": "none",
      "note": "As 'pointGroup'. BUS zoneKind has no air-quality member; 'other' is the honest value."
    },
    {
      "source": "airTerminalUnit",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "air-input",
        "air-output",
        "elec-input"
      ]
    },
    {
      "source": "ates",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "battery",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "elec-output"
      ]
    },
    {
      "source": "boiler",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "elec-input"
      ]
    },
    {
      "source": "branchSelector",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "refrig-input"
      ]
    },
    {
      "source": "cable",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "component"
      },
      "fidelity": "widening",
      "note": "An assembly of insulated conductors."
    },
    {
      "source": "cav",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "chilled-water-plant",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "chilled-water-output"
      ]
    },
    {
      "source": "chilled-water-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "hvac",
        "medium": "chilledWater"
      },
      "fidelity": "exact"
    },
    {
      "source": "chilledBeam",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "chiller",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "elec-input"
      ]
    },
    {
      "source": "circuit",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "elec-input",
        "elec-output"
      ]
    },
    {
      "source": "coil",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "computed-point",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Point",
      "fidelity": "conditional",
      "note": "A capability marker, not a measurement. pointKind is not derivable from this def; see pointKindMap."
    },
    {
      "source": "computedModel",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": null,
      "fidelity": "none",
      "note": "As 'syntheticModel'."
    },
    {
      "source": "computer",
      "sourceKind": "marker",
      "lib": "phIct",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "device"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a device'."
    },
    {
      "source": "condenser-water-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "hvac",
        "medium": "condenserWater"
      },
      "fidelity": "exact"
    },
    {
      "source": "conduit",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "component"
      },
      "fidelity": "widening",
      "note": "A duct, pipe or wire run. BUS permits a conduit as an asset with assetKind 'component' but never requires one; a receiver MUST NOT assume conduits are present."
    },
    {
      "source": "controller",
      "sourceKind": "marker",
      "lib": "phIct",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "device"
      },
      "fidelity": "widening",
      "note": "That the device controls something is a relationship in BUS (bus:controls), not a class. equipRef on a controller becomes bus:controls, not bus:partOf."
    },
    {
      "source": "controls-panel",
      "sourceKind": "conjunct",
      "lib": "phIct",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "An enclosure holding controllers. The controllers inside are bus:Asset device with bus:partOf."
    },
    {
      "source": "coolingCoil",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "coolingTower",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "elec-input"
      ]
    },
    {
      "source": "crac",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "cur-point",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Point",
      "fidelity": "conditional",
      "note": "A capability marker, not a measurement. pointKind is not derivable from this def; see pointKindMap."
    },
    {
      "source": "damper-actuator",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "dataCenter",
      "sourceKind": "marker",
      "lib": "phIct",
      "busType": "bus:Space",
      "busFields": {
        "spaceKind": "room"
      },
      "fidelity": "widening",
      "note": "BUS has no data-centre space kind. Space.occupancyType carries the use."
    },
    {
      "source": "dc-elec-meter",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "dc-evse-port",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "device",
      "sourceKind": "marker",
      "lib": "phIct",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "device"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a device'."
    },
    {
      "source": "doas",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "domestic-cold-water-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "plumbing",
        "medium": "water"
      },
      "fidelity": "widening",
      "note": "Neither potability nor temperature is expressible in the medium enum."
    },
    {
      "source": "domestic-hot-water-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "plumbing",
        "medium": "water"
      },
      "fidelity": "widening",
      "note": "BUS 'hotWater' denotes the heating medium. Mapping domestic hot water onto it would tell a receiver the loop serves space heating, which is the class of silent error 9.3's medium requirement exists to prevent. 'water' plus the classification is the honest form."
    },
    {
      "source": "domestic-water-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "plumbing",
        "medium": "water"
      },
      "fidelity": "widening",
      "note": "Potability lost; see mediumMap."
    },
    {
      "source": "duct",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "component"
      },
      "fidelity": "widening",
      "note": "As 'pipe'. A duct static pressure sensor belongs to the duct in Haystack; in BUS it is a point with bus:partOf to whatever asset the exporter chose."
    },
    {
      "source": "elec-meter",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "elec-input",
        "elec-output"
      ]
    },
    {
      "source": "elec-panel",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "elec-input",
        "elec-output"
      ]
    },
    {
      "source": "elec-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "electrical",
        "medium": "electricity"
      },
      "fidelity": "exact"
    },
    {
      "source": "elevator",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "elec-input"
      ]
    },
    {
      "source": "entity",
      "sourceKind": "marker",
      "lib": "ph",
      "busType": null,
      "fidelity": "none",
      "note": "The abstract root. Not a BUS class: every BUS entity has a concrete type (8.1)."
    },
    {
      "source": "equip",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "exact"
    },
    {
      "source": "escalator",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "elec-input"
      ]
    },
    {
      "source": "evse-cable",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "component"
      },
      "fidelity": "widening",
      "note": "EV supply cable."
    },
    {
      "source": "evse-dispenser",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "evse-equip",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "elec-input",
        "elec-output"
      ]
    },
    {
      "source": "evse-port",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "evse-powerConverter",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "evse-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "electrical",
        "medium": "electricity"
      },
      "fidelity": "exact"
    },
    {
      "source": "evseSession",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": null,
      "fidelity": "none",
      "note": "A charging transaction record. Out of scope by 1.4: it is an event in a billing system, not a description of the building. Not even bus:Event covers it, whose 15 kinds are about the model and its operation."
    },
    {
      "source": "fan-motor",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "fcu",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "floor",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Space",
      "busFields": {
        "spaceKind": "storey"
      },
      "fidelity": "exact"
    },
    {
      "source": "flow-meter",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "flowInverter",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "fumeHood",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "elec-input"
      ]
    },
    {
      "source": "ground-floor",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Space",
      "busFields": {
        "spaceKind": "storey"
      },
      "fidelity": "exact",
      "note": "Ordinal 0 by convention; BUS orders storeys by a signed Space.ordinal, Haystack by the scalar floorNum."
    },
    {
      "source": "heatExchanger",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "heatingCoil",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "his-point",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Point",
      "fidelity": "conditional",
      "note": "A capability marker, not a measurement. pointKind is not derivable from this def; see pointKindMap."
    },
    {
      "source": "hot-water-boiler",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "hot-water-output"
      ]
    },
    {
      "source": "hot-water-plant",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "hot-water-output"
      ]
    },
    {
      "source": "hot-water-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "hvac",
        "medium": "hotWater"
      },
      "fidelity": "exact"
    },
    {
      "source": "humidifier-equip",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "hvac-zone-space",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Zone",
      "busFields": {
        "zoneKind": "hvac"
      },
      "fidelity": "conditional",
      "note": "As 'zone-space'. Note this def also declares 'air-input' in its is list — a space with a port. The port half goes to portMap and MUST NOT become a classification or an abstractType (8.2).",
      "declaresPorts": [
        "air-input"
      ]
    },
    {
      "source": "hvacZonePoints",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Zone",
      "busFields": {
        "zoneKind": "hvac"
      },
      "fidelity": "none",
      "note": "As 'pointGroup'."
    },
    {
      "source": "laptop",
      "sourceKind": "marker",
      "lib": "phIct",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "device"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a device'."
    },
    {
      "source": "lighting-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "lighting"
      },
      "fidelity": "exact",
      "note": "No medium: a lighting system distributes light, and BUS's Medium enum is about conveyed substances. Leaving medium absent is correct; 'signal' and 'electricity' would both be wrong."
    },
    {
      "source": "lighting-zone-space",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Zone",
      "busFields": {
        "zoneKind": "lighting"
      },
      "fidelity": "conditional",
      "note": "As 'zone-space'."
    },
    {
      "source": "lightingZonePoints",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Zone",
      "busFields": {
        "zoneKind": "lighting"
      },
      "fidelity": "none",
      "note": "As 'pointGroup'."
    },
    {
      "source": "luminaire",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "Declares both equip and pointGroup. Only the equip half maps; the point-bundle half is lost as for 'pointGroup'.",
      "declaresPorts": [
        "elec-input"
      ]
    },
    {
      "source": "mau",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "meter",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The meter is an asset; its register is a bus:Point with pointKind 'meter'. The meterScope choice (siteMeter | submeter) lands on Point.meterScope, not on the asset — see pointKindMap."
    },
    {
      "source": "ml-point",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Point",
      "fidelity": "conditional",
      "note": "A capability marker, not a measurement. pointKind is not derivable from this def; see pointKindMap."
    },
    {
      "source": "mlModel",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": null,
      "fidelity": "none",
      "note": "As 'syntheticModel'."
    },
    {
      "source": "mlVar",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": null,
      "fidelity": "conditional",
      "note": "A machine-learning model variable. Where mlVarPoint binds it to a real point, that point is a bus:Point with pointKind 'derived' and bus:derivedFrom to its inputs. The variable itself has no BUS entity. Annex F.1 names analytic-rule portability as an open gap."
    },
    {
      "source": "mobile-phone",
      "sourceKind": "conjunct",
      "lib": "phIct",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "device"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a device'."
    },
    {
      "source": "motor",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "elec-input"
      ]
    },
    {
      "source": "movingWalkway",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "elec-input"
      ]
    },
    {
      "source": "network",
      "sourceKind": "marker",
      "lib": "phIct",
      "busType": "bus:Network",
      "busFields": {
        "networkKind": "other"
      },
      "fidelity": "narrowing",
      "note": "bus:Network REQUIRES networkKind and Haystack's ^network def carries no kind. An importer that cannot determine the kind from the protocol MUST write 'other' rather than guess 'fieldbus'. Where the network's protocol is known, bus-protocols.json fixes the token."
    },
    {
      "source": "networking-device",
      "sourceKind": "conjunct",
      "lib": "phIct",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "device"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a device'."
    },
    {
      "source": "networking-router",
      "sourceKind": "conjunct",
      "lib": "phIct",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "device"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a device'."
    },
    {
      "source": "networking-switch",
      "sourceKind": "conjunct",
      "lib": "phIct",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "device"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a device'."
    },
    {
      "source": "panel",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "phone",
      "sourceKind": "marker",
      "lib": "phIct",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "device"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a device'."
    },
    {
      "source": "pipe",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "component"
      },
      "fidelity": "widening",
      "note": "Haystack makes a physical run first class so it can carry its own points. BUS has no conduit class; the symbol-role vocabulary has a 'pipe' root on the presentation side with no model-side counterpart."
    },
    {
      "source": "plant",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "point",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Point",
      "fidelity": "conditional",
      "note": "The ^point cone is 9 capability defs and none of them says what the point means. pointKind comes from the pointFunction choice, not from the class — see pointKindMap."
    },
    {
      "source": "pointGroup",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Zone",
      "busFields": {
        "zoneKind": "other"
      },
      "fidelity": "none",
      "note": "A named bundle of points expected on a space or equip. BUS expresses the membership with bus:hasMember but has nothing that names the bundle as a reusable set, so the bundle identity is lost. Related to the prototype gap (children), declined for v0.3."
    },
    {
      "source": "pump-motor",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "rack",
      "sourceKind": "marker",
      "lib": "phIct",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "radiantEquip",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "radiantFloor",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "radiator",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "refrig-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "hvac",
        "medium": "refrigerant"
      },
      "fidelity": "exact"
    },
    {
      "source": "roof-floor",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Space",
      "busFields": {
        "spaceKind": "storey"
      },
      "fidelity": "widening",
      "note": "BUS has both spaceKind 'storey' and spaceKind 'roof'. A roof-floor is a storey that is the roof; the exporter MUST pick one and SHOULD pick 'storey' with a 'roof' classification, because the ordinal matters more than the label."
    },
    {
      "source": "room",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Space",
      "busFields": {
        "spaceKind": "room"
      },
      "fidelity": "exact"
    },
    {
      "source": "rtu",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "server-computer",
      "sourceKind": "conjunct",
      "lib": "phIct",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "device"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a device'."
    },
    {
      "source": "sim-point",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Point",
      "fidelity": "conditional",
      "note": "A capability marker, not a measurement. pointKind is not derivable from this def; see pointKindMap."
    },
    {
      "source": "simModel",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": null,
      "fidelity": "none",
      "note": "As 'syntheticModel'."
    },
    {
      "source": "site",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Building",
      "fidelity": "conditional",
      "note": "A Haystack site is a geographic location, which is a building only in the common case. Rule: emit bus:Building when the site holds exactly one building; otherwise emit bus:Space with spaceKind 'site' and bus:contains to each bus:Building. The choice MUST be recorded in provenance, because the two produce different packages from the same source."
    },
    {
      "source": "space",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Space",
      "busFields": {
        "spaceKind": "other"
      },
      "fidelity": "widening",
      "note": "The generic space def. BUS spaceKind 'unknown' is for an exporter that does not know; 'other' is for one that knows and finds no member. A generic Haystack space is the latter."
    },
    {
      "source": "steam-boiler",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "steam-output"
      ]
    },
    {
      "source": "steam-plant",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "steam-output"
      ]
    },
    {
      "source": "steam-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "hvac",
        "medium": "steam"
      },
      "fidelity": "exact"
    },
    {
      "source": "subterranean-floor",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Space",
      "busFields": {
        "spaceKind": "storey"
      },
      "fidelity": "exact",
      "note": "Negative Space.ordinal."
    },
    {
      "source": "synthetic-point",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Point",
      "fidelity": "conditional",
      "note": "A capability marker, not a measurement. pointKind is not derivable from this def; see pointKindMap."
    },
    {
      "source": "syntheticModel",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": null,
      "fidelity": "none",
      "note": "A model that produces point values. BUS has no construct: bus:Sequence is control logic, not a value-producing model, and MUST NOT be used for it."
    },
    {
      "source": "system",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "other"
      },
      "fidelity": "widening",
      "note": "The generic grouping def."
    },
    {
      "source": "tablet",
      "sourceKind": "marker",
      "lib": "phIct",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "device"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a device'."
    },
    {
      "source": "tank",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "thermostat",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "device"
      },
      "fidelity": "widening",
      "note": "Declares both equip and pointGroup. A thermostat hosts points, so assetKind 'device' is the closer of the four; the point-bundle half is lost."
    },
    {
      "source": "unitVent",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "ups",
      "sourceKind": "marker",
      "lib": "phIct",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "valve-actuator",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "vav",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "verticalTransport",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "vrf-coolingOnly-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "hvac",
        "medium": "refrigerant"
      },
      "fidelity": "exact"
    },
    {
      "source": "vrf-equip",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "vrf-heatPump-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "hvac",
        "medium": "refrigerant"
      },
      "fidelity": "exact"
    },
    {
      "source": "vrf-heatRecovery-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "hvac",
        "medium": "refrigerant"
      },
      "fidelity": "exact"
    },
    {
      "source": "vrf-indoorUnit",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "refrig-input"
      ]
    },
    {
      "source": "vrf-indoorUnit-fcu",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "vrf-outdoorUnit",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "refrig-output"
      ]
    },
    {
      "source": "vrf-refrig-plant",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect.",
      "declaresPorts": [
        "refrig-output"
      ]
    },
    {
      "source": "vrf-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "hvac",
        "medium": "refrigerant"
      },
      "fidelity": "exact"
    },
    {
      "source": "water-system",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:System",
      "busFields": {
        "systemKind": "plumbing",
        "medium": "water"
      },
      "fidelity": "conditional",
      "note": "Haystack's water-system 'supplies or collects potable or non-potable water in any state', which spans plumbing and hvac. Rule: systemKind 'plumbing' unless the system's members are hvac equipment, in which case 'hvac'."
    },
    {
      "source": "weather-point",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Point",
      "fidelity": "conditional",
      "note": "A capability marker, not a measurement. pointKind is not derivable from this def; see pointKindMap."
    },
    {
      "source": "weatherStation",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "BUS has no weather vocabulary and declined one (R11). Nothing in BUS declares the station off-premises or third-party, which is the one thing Haystack's construct says that BUS cannot."
    },
    {
      "source": "well",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "equipment"
      },
      "fidelity": "widening",
      "note": "The leaf class is preserved verbatim in classifications (7.7); BUS structure keeps only 'a piece of equipment'. This is 5.3.3 working as designed, not a defect."
    },
    {
      "source": "wire",
      "sourceKind": "marker",
      "lib": "phIoT",
      "busType": "bus:Asset",
      "busFields": {
        "assetKind": "component"
      },
      "fidelity": "widening",
      "note": "As 'pipe'."
    },
    {
      "source": "writable-point",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Point",
      "fidelity": "conditional",
      "note": "A capability marker, not a measurement. pointKind is not derivable from this def; see pointKindMap."
    },
    {
      "source": "zone-space",
      "sourceKind": "conjunct",
      "lib": "phIoT",
      "busType": "bus:Zone",
      "busFields": {
        "zoneKind": "other"
      },
      "fidelity": "conditional",
      "note": "Haystack models a zone as a kind of space; BUS separates bus:Space (a volume) from bus:Zone (a control grouping). Rule: emit a bus:Zone, and additionally a bus:Space with bus:hasMember from the zone where the source zone-space is also used as a physical volume."
    }
  ],
  "pointKindMap": {
    "rule": "pointKind comes from the pointFunction choice, not from the ^point cone. The nine defs in that cone are capability markers and none of them names a measurement (8.6).",
    "fromPointFunction": [
      {
        "source": "sensor",
        "busPointKind": "sensor",
        "fidelity": "exact"
      },
      {
        "source": "cmd",
        "busPointKind": "command",
        "fidelity": "exact"
      },
      {
        "source": "sp",
        "busPointKind": "setpoint",
        "fidelity": "exact"
      },
      {
        "source": "synthetic",
        "busPointKind": "derived",
        "fidelity": "exact",
        "note": "sim-point, computed-point and ml-point all reduce to 'derived'; which of the three is lost from structure and kept in classifications."
      }
    ],
    "notReachableFromPointFunction": [
      {
        "busPointKind": "status",
        "fidelity": "conditional",
        "note": "Haystack has no status function. Rule: a point with 'sensor' and kind 'Bool' whose subject is a run state MAY be exported as pointKind 'status'; an exporter that cannot tell MUST write 'sensor'."
      },
      {
        "busPointKind": "parameter",
        "fidelity": "none",
        "note": "No Haystack equivalent at all. A tuning constant is a setpoint in Haystack. An importer MUST NOT infer 'parameter'."
      },
      {
        "busPointKind": "meter",
        "fidelity": "conditional",
        "note": "Rule: a point on an entity in the ^meter cone whose quantity is a totalized register is pointKind 'meter'. Haystack marks the meter, not the point."
      }
    ],
    "meterScope": [
      {
        "source": "siteMeter",
        "busField": "Point.meterScope",
        "busValue": "site",
        "fidelity": "exact"
      },
      {
        "source": "submeter",
        "busField": "Point.meterScope",
        "busValue": "submeter",
        "fidelity": "exact"
      },
      {
        "source": null,
        "busField": "Point.meterScope",
        "busValue": "virtual",
        "fidelity": "none",
        "note": "Haystack has no virtual-meter flag. Brick has brick:isVirtualMeter. An importer from Haystack MUST leave meterScope absent rather than assume a physical meter."
      }
    ],
    "pointFields": [
      {
        "source": "unit",
        "busField": "Point.unitCode",
        "fidelity": "conditional",
        "note": "See unitMap. The unit is a str tag naming a Fantom unit; Zinc numbers repeat it inline. Where the two disagree the exporter MUST NOT choose silently."
      },
      {
        "source": "kind",
        "busField": "Point.dataType",
        "fidelity": "conditional",
        "note": "Haystack kinds Number, Bool, Str, Ref, Coord, and the rest, onto five BUS data types. Ref and Coord have no BUS dataType and become properties (7.8)."
      },
      {
        "source": "enum",
        "busField": "Point.enumeration",
        "fidelity": "exact"
      },
      {
        "source": "minVal",
        "busField": "Point.range.min",
        "fidelity": "exact"
      },
      {
        "source": "maxVal",
        "busField": "Point.range.max",
        "fidelity": "exact"
      },
      {
        "source": "writable",
        "busField": "Point.writable",
        "fidelity": "exact"
      },
      {
        "source": "his",
        "busField": "Point.history.available",
        "fidelity": "widening",
        "note": "BUS carries {available, from, to}; Haystack's hisStart and hisEnd supply from and to. hisMode, hisInterpolate and hisTotalized have no BUS field (8.8)."
      },
      {
        "source": "cur",
        "busField": "Point.binding",
        "fidelity": "conditional",
        "note": "The ^cur marker says a live value is subscribable, which in BUS is implied by the presence of a TelemetryBinding, not stated. curVal and curStatus are live state and out of scope."
      },
      {
        "source": "tz",
        "busField": null,
        "fidelity": "none",
        "note": "Haystack tags tz on a point; BUS carries timeZone on bus:Space and bus:Building only. A point-level time zone becomes a property against a declared PropertyDefinition (7.8)."
      }
    ]
  },
  "predicateMap": [
    {
      "source": "airRef",
      "sourceKind": "refTag",
      "of": "air-output",
      "tagOn": [
        "air-input"
      ],
      "busPredicate": "bus:fedBy",
      "medium": "air",
      "mediumSatisfiable": true,
      "mediumSource": "predicateName",
      "fidelity": "exact",
      "subjectPort": "air-input",
      "objectPort": "air-output",
      "note": "Substance-specific flow reference. The medium is fixed by the tag name and by the of/tagOn port conjuncts, so BUS 9.3's medium requirement is satisfiable without inference: this is the case Brick cannot match (R8). Direction: the tagged entity is fed by the referenced entity, so the BUS edge is bus:fedBy from the subject, or bus:feeds from the object. Ports are named by the portMap convention."
    },
    {
      "source": "blowdownWaterRef",
      "sourceKind": "refTag",
      "of": "blowdown-water-output",
      "tagOn": [
        "blowdown-water-input"
      ],
      "busPredicate": "bus:fedBy",
      "medium": "water",
      "mediumSatisfiable": true,
      "mediumSource": "predicateName",
      "fidelity": "widening",
      "subjectPort": "blowdown-water-input",
      "objectPort": "blowdown-water-output",
      "note": "Substance-specific flow reference. The medium is fixed by the tag name and by the of/tagOn port conjuncts, so BUS 9.3's medium requirement is satisfiable without inference: this is the case Brick cannot match (R8). Direction: the tagged entity is fed by the referenced entity, so the BUS edge is bus:fedBy from the subject, or bus:feeds from the object. Ports are named by the portMap convention. BUS has no blowdown medium. That the water is boiler or tower blowdown survives only as the source term in Relationship.qualifiers."
    },
    {
      "source": "chilledWaterRef",
      "sourceKind": "refTag",
      "of": "chilled-water-output",
      "tagOn": [
        "chilled-water-input"
      ],
      "busPredicate": "bus:fedBy",
      "medium": "chilledWater",
      "mediumSatisfiable": true,
      "mediumSource": "predicateName",
      "fidelity": "exact",
      "subjectPort": "chilled-water-input",
      "objectPort": "chilled-water-output",
      "note": "Substance-specific flow reference. The medium is fixed by the tag name and by the of/tagOn port conjuncts, so BUS 9.3's medium requirement is satisfiable without inference: this is the case Brick cannot match (R8). Direction: the tagged entity is fed by the referenced entity, so the BUS edge is bus:fedBy from the subject, or bus:feeds from the object. Ports are named by the portMap convention."
    },
    {
      "source": "condensateRef",
      "sourceKind": "refTag",
      "of": "condensate-output",
      "tagOn": [
        "condensate-input"
      ],
      "busPredicate": "bus:fedBy",
      "medium": "water",
      "mediumSatisfiable": true,
      "mediumSource": "predicateName",
      "fidelity": "widening",
      "subjectPort": "condensate-input",
      "objectPort": "condensate-output",
      "note": "Substance-specific flow reference. The medium is fixed by the tag name and by the of/tagOn port conjuncts, so BUS 9.3's medium requirement is satisfiable without inference: this is the case Brick cannot match (R8). Direction: the tagged entity is fed by the referenced entity, so the BUS edge is bus:fedBy from the subject, or bus:feeds from the object. Ports are named by the portMap convention. Steam condensate. BUS 'steam' names the vapour; the returning liquid is 'water'. The phase relationship between the two edges is not expressible."
    },
    {
      "source": "condenserWaterRef",
      "sourceKind": "refTag",
      "of": "condenser-water-output",
      "tagOn": [
        "condenser-water-input"
      ],
      "busPredicate": "bus:fedBy",
      "medium": "condenserWater",
      "mediumSatisfiable": true,
      "mediumSource": "predicateName",
      "fidelity": "exact",
      "subjectPort": "condenser-water-input",
      "objectPort": "condenser-water-output",
      "note": "Substance-specific flow reference. The medium is fixed by the tag name and by the of/tagOn port conjuncts, so BUS 9.3's medium requirement is satisfiable without inference: this is the case Brick cannot match (R8). Direction: the tagged entity is fed by the referenced entity, so the BUS edge is bus:fedBy from the subject, or bus:feeds from the object. Ports are named by the portMap convention."
    },
    {
      "source": "containedBy",
      "sourceKind": "relationship",
      "of": null,
      "tagOn": [],
      "busPredicate": "bus:containedIn",
      "fidelity": "widening",
      "note": "The generic containment relationship. BUS distinguishes containment, part-of, membership and location as four separate predicate pairs (9.2); the generic tag cannot say which, so an importer MUST choose from the endpoint types and MUST NOT default to bus:contains for equipment."
    },
    {
      "source": "contains",
      "sourceKind": "relationship",
      "of": null,
      "tagOn": [],
      "busPredicate": "bus:contains",
      "fidelity": "conditional",
      "note": "Marked computedFromReciprocal in Haystack and never present in source. An exporter reading a Haystack server via op:defs will see it; one reading .trio source will not. A conformance claim MUST state which was consumed (2.4-1 self-sufficiency, applied to crosswalks).",
      "authored": false
    },
    {
      "source": "deviceRef",
      "sourceKind": "refTag",
      "of": "device",
      "tagOn": [],
      "busPredicate": "bus:hostedBy",
      "fidelity": "conditional",
      "note": "'Device which controls a monitors this entity'. Two BUS predicates are hidden in one tag: on a point it is bus:hostedBy (the device that gives the point an address, 9.2); on an equip it is bus:controlledBy. Rule: subject is a point, emit bus:hostedBy; otherwise emit bus:controlledBy. An importer that cannot tell MUST emit bus:hostedBy only for points and leave the rest as bus:references, not guess.",
      "alternatePredicates": [
        "bus:controlledBy",
        "bus:references"
      ]
    },
    {
      "source": "domesticWaterRef",
      "sourceKind": "refTag",
      "of": "domestic-water-output",
      "tagOn": [
        "domestic-water-input"
      ],
      "busPredicate": "bus:fedBy",
      "medium": "water",
      "mediumSatisfiable": true,
      "mediumSource": "predicateName",
      "fidelity": "widening",
      "subjectPort": "domestic-water-input",
      "objectPort": "domestic-water-output",
      "note": "Substance-specific flow reference. The medium is fixed by the tag name and by the of/tagOn port conjuncts, so BUS 9.3's medium requirement is satisfiable without inference: this is the case Brick cannot match (R8). Direction: the tagged entity is fed by the referenced entity, so the BUS edge is bus:fedBy from the subject, or bus:feeds from the object. Ports are named by the portMap convention. Potability is lost: BUS draws no potable/non-potable distinction."
    },
    {
      "source": "elecRef",
      "sourceKind": "refTag",
      "of": "elec-output",
      "tagOn": [
        "elec-input"
      ],
      "busPredicate": "bus:fedBy",
      "medium": "electricity",
      "mediumSatisfiable": true,
      "mediumSource": "predicateName",
      "fidelity": "exact",
      "subjectPort": "elec-input",
      "objectPort": "elec-output",
      "note": "Substance-specific flow reference. The medium is fixed by the tag name and by the of/tagOn port conjuncts, so BUS 9.3's medium requirement is satisfiable without inference: this is the case Brick cannot match (R8). Direction: the tagged entity is fed by the referenced entity, so the BUS edge is bus:fedBy from the subject, or bus:feeds from the object. Ports are named by the portMap convention."
    },
    {
      "source": "equipRef",
      "sourceKind": "refTag",
      "of": "equip",
      "tagOn": [
        "controller",
        "equip",
        "point"
      ],
      "busPredicate": "bus:partOf",
      "fidelity": "conditional",
      "note": "Haystack's one containment tag for equipment does three BUS jobs. Rule: point to equip, bus:partOf; equip to equip, bus:partOf; controller to equip, bus:controls (reversed subject and object). A translator that maps all three to bus:partOf asserts that a controller is a component of the AHU it controls, which is false and unrecoverable.",
      "alternatePredicates": [
        "bus:controls"
      ]
    },
    {
      "source": "fuelOilRef",
      "sourceKind": "refTag",
      "of": "fuelOil-output",
      "tagOn": [
        "fuelOil-input"
      ],
      "busPredicate": "bus:fedBy",
      "medium": "fuelOil",
      "mediumSatisfiable": true,
      "mediumSource": "predicateName",
      "fidelity": "exact",
      "subjectPort": "fuelOil-input",
      "objectPort": "fuelOil-output",
      "note": "Substance-specific flow reference. The medium is fixed by the tag name and by the of/tagOn port conjuncts, so BUS 9.3's medium requirement is satisfiable without inference: this is the case Brick cannot match (R8). Direction: the tagged entity is fed by the referenced entity, so the BUS edge is bus:fedBy from the subject, or bus:feeds from the object. Ports are named by the portMap convention."
    },
    {
      "source": "gasolineRef",
      "sourceKind": "refTag",
      "of": "gasoline-output",
      "tagOn": [
        "gasoline-input"
      ],
      "busPredicate": "bus:fedBy",
      "medium": "other",
      "mediumSatisfiable": true,
      "mediumSource": "predicateName",
      "fidelity": "none",
      "subjectPort": "gasoline-input",
      "objectPort": "gasoline-output",
      "note": "Substance-specific flow reference. The medium is fixed by the tag name and by the of/tagOn port conjuncts, so BUS 9.3's medium requirement is satisfiable without inference: this is the case Brick cannot match (R8). Direction: the tagged entity is fed by the referenced entity, so the BUS edge is bus:fedBy from the subject, or bus:feeds from the object. Ports are named by the portMap convention. BUS has no medium for motor fuel. 'fuelOil' is a different substance and MUST NOT be substituted. R8 applies: medium 'other' plus the source term in qualifiers."
    },
    {
      "source": "hotWaterRef",
      "sourceKind": "refTag",
      "of": "hot-water-output",
      "tagOn": [
        "hot-water-input"
      ],
      "busPredicate": "bus:fedBy",
      "medium": "hotWater",
      "mediumSatisfiable": true,
      "mediumSource": "predicateName",
      "fidelity": "exact",
      "subjectPort": "hot-water-input",
      "objectPort": "hot-water-output",
      "note": "Substance-specific flow reference. The medium is fixed by the tag name and by the of/tagOn port conjuncts, so BUS 9.3's medium requirement is satisfiable without inference: this is the case Brick cannot match (R8). Direction: the tagged entity is fed by the referenced entity, so the BUS edge is bus:fedBy from the subject, or bus:feeds from the object. Ports are named by the portMap convention."
    },
    {
      "source": "id",
      "sourceKind": "refTag",
      "of": null,
      "tagOn": [
        "entity"
      ],
      "busPredicate": null,
      "fidelity": "conditional",
      "note": "Not a predicate: identity. A Haystack id is a project-scoped ref such as @abc-123. BUS requires an absolute URI (6.1), so the importer mints one and records the Haystack ref in externalIds (6.3). Requirement 6.4-1 makes an unrecorded reassignment a conformance failure.",
      "busConstruct": "Entity.id + Entity.externalIds"
    },
    {
      "source": "inputs",
      "sourceKind": "relationship",
      "of": null,
      "tagOn": [],
      "busPredicate": "bus:fedBy",
      "fidelity": "conditional",
      "note": "The generic reciprocal of the substance ref tags. THIS IS THE HAYSTACK R8 CASE: where a model asserts only the generic ^inputs relationship and not one of the 14 substance-specific ref tags, no medium is available, and BUS 9.3 forbids a bus:feeds with no medium. The importer MUST emit medium 'other' with the source term in qualifiers and MUST declare the relationships domain partial with reason notSupportedByExporter (16.6).",
      "mediumSatisfiable": false
    },
    {
      "source": "makeupWaterRef",
      "sourceKind": "refTag",
      "of": "makeup-water-output",
      "tagOn": [
        "makeup-water-input"
      ],
      "busPredicate": "bus:fedBy",
      "medium": "water",
      "mediumSatisfiable": true,
      "mediumSource": "predicateName",
      "fidelity": "widening",
      "subjectPort": "makeup-water-input",
      "objectPort": "makeup-water-output",
      "note": "Substance-specific flow reference. The medium is fixed by the tag name and by the of/tagOn port conjuncts, so BUS 9.3's medium requirement is satisfiable without inference: this is the case Brick cannot match (R8). Direction: the tagged entity is fed by the referenced entity, so the BUS edge is bus:fedBy from the subject, or bus:feeds from the object. Ports are named by the portMap convention. That the water is makeup for a loop is lost from the structural layer."
    },
    {
      "source": "mlOutputVarRef",
      "sourceKind": "refTag",
      "of": "mlVar",
      "tagOn": [
        "mlModel"
      ],
      "busPredicate": null,
      "fidelity": "none",
      "note": "Model to its output variable. Neither endpoint has a BUS class."
    },
    {
      "source": "mlVarPoint",
      "sourceKind": "refTag",
      "of": "point",
      "tagOn": [
        "mlVar"
      ],
      "busPredicate": null,
      "fidelity": "conditional",
      "note": "Binds an ML variable to a real point. The point exists in BUS; the variable does not, so only the point survives, with pointKind 'derived' where it is an output."
    },
    {
      "source": "mlVarRef",
      "sourceKind": "refTag",
      "of": "mlVar",
      "tagOn": [],
      "busPredicate": null,
      "fidelity": "none",
      "note": "Reference to an ML variable. No BUS endpoint."
    },
    {
      "source": "naturalGasRef",
      "sourceKind": "refTag",
      "of": "naturalGas-output",
      "tagOn": [
        "naturalGas-input"
      ],
      "busPredicate": "bus:fedBy",
      "medium": "gas",
      "mediumSatisfiable": true,
      "mediumSource": "predicateName",
      "fidelity": "widening",
      "subjectPort": "naturalGas-input",
      "objectPort": "naturalGas-output",
      "note": "Substance-specific flow reference. The medium is fixed by the tag name and by the of/tagOn port conjuncts, so BUS 9.3's medium requirement is satisfiable without inference: this is the case Brick cannot match (R8). Direction: the tagged entity is fed by the referenced entity, so the BUS edge is bus:fedBy from the subject, or bus:feeds from the object. Ports are named by the portMap convention. BUS 'gas' is the generic fuel gas. Natural gas specifically is recoverable only from the classification."
    },
    {
      "source": "networkRef",
      "sourceKind": "refTag",
      "of": "network",
      "tagOn": [],
      "busPredicate": "bus:connectedTo",
      "fidelity": "conditional",
      "note": "Device to network membership. Where the entity is a point with a binding, the same fact also populates TelemetryBinding.networkRef (8.7). Emitting both is redundant; the binding form is preferred for points and the relationship form for devices.",
      "busConstruct": "TelemetryBinding.networkRef"
    },
    {
      "source": "outputs",
      "sourceKind": "relationship",
      "of": null,
      "tagOn": [],
      "busPredicate": "bus:feeds",
      "fidelity": "conditional",
      "note": "As 'inputs'. R8 applies.",
      "mediumSatisfiable": false
    },
    {
      "source": "pointRef",
      "sourceKind": "refTag",
      "of": "point",
      "tagOn": [
        "sim-point"
      ],
      "busPredicate": "bus:derivedFrom",
      "fidelity": "conditional",
      "note": "Tagged only on sim-point: the real point this one simulates. bus:derivedFrom is the nearest predicate but overstates the relation — a simulation is not a calculation over the source. An importer SHOULD add a qualifier naming the tag."
    },
    {
      "source": "ref",
      "sourceKind": "refTag",
      "of": null,
      "tagOn": [],
      "busPredicate": null,
      "fidelity": "none",
      "note": "The ref value kind itself, not a relationship. No BUS counterpart is needed."
    },
    {
      "source": "refrigRef",
      "sourceKind": "refTag",
      "of": "refrig-output",
      "tagOn": [
        "refrig-input"
      ],
      "busPredicate": "bus:fedBy",
      "medium": "refrigerant",
      "mediumSatisfiable": true,
      "mediumSource": "predicateName",
      "fidelity": "exact",
      "subjectPort": "refrig-input",
      "objectPort": "refrig-output",
      "note": "Substance-specific flow reference. The medium is fixed by the tag name and by the of/tagOn port conjuncts, so BUS 9.3's medium requirement is satisfiable without inference: this is the case Brick cannot match (R8). Direction: the tagged entity is fed by the referenced entity, so the BUS edge is bus:fedBy from the subject, or bus:feeds from the object. Ports are named by the portMap convention."
    },
    {
      "source": "siteRef",
      "sourceKind": "refTag",
      "of": "site",
      "tagOn": [
        "equip",
        "point",
        "space",
        "system"
      ],
      "busPredicate": "bus:locatedIn",
      "fidelity": "conditional",
      "note": "Haystack denormalizes: an entity carries siteRef and spaceRef even though one implies the other. Rule: emit containment for the most specific reference only. Emit the siteRef edge only where the spaceRef chain does not reach the site, or where no spaceRef is present. Emitting both produces a package that is valid, redundant, and diverges on the next edit.",
      "alternatePredicates": [
        "bus:containedIn"
      ]
    },
    {
      "source": "spaceRef",
      "sourceKind": "refTag",
      "of": "space",
      "tagOn": [
        "equip",
        "point",
        "space"
      ],
      "busPredicate": "bus:locatedIn",
      "fidelity": "conditional",
      "note": "Rule: space to space, bus:containedIn; equip or point to space, bus:locatedIn. BUS multi-parent containment (8.4) is a superset of Haystack's single spaceRef, so this direction never loses information.",
      "alternatePredicates": [
        "bus:containedIn"
      ]
    },
    {
      "source": "steamRef",
      "sourceKind": "refTag",
      "of": "steam-output",
      "tagOn": [
        "steam-input"
      ],
      "busPredicate": "bus:fedBy",
      "medium": "steam",
      "mediumSatisfiable": true,
      "mediumSource": "predicateName",
      "fidelity": "exact",
      "subjectPort": "steam-input",
      "objectPort": "steam-output",
      "note": "Substance-specific flow reference. The medium is fixed by the tag name and by the of/tagOn port conjuncts, so BUS 9.3's medium requirement is satisfiable without inference: this is the case Brick cannot match (R8). Direction: the tagged entity is fed by the referenced entity, so the BUS edge is bus:fedBy from the subject, or bus:feeds from the object. Ports are named by the portMap convention."
    },
    {
      "source": "submeterOf",
      "sourceKind": "refTag",
      "of": "meter",
      "tagOn": [
        "meter"
      ],
      "busPredicate": "bus:subMeterOf",
      "fidelity": "exact",
      "note": "New in BUS v0.3. Haystack and Brick converged on the same shape, which is what promoted it (15.5). 'Reference to parent meter which is immediately upstream of this meter' matches bus:subMeterOf exactly, including the immediacy."
    },
    {
      "source": "syntheticModelRef",
      "sourceKind": "refTag",
      "of": "syntheticModel",
      "tagOn": [
        "synthetic-point"
      ],
      "busPredicate": "bus:derivedFrom",
      "fidelity": "conditional",
      "note": "The object has no BUS entity (see syntheticModel in entityTypeMap), so this edge usually has nothing to point at and is dropped. Where the exporter materializes the model as a bus:Resource, the edge becomes bus:derivedFrom to it."
    },
    {
      "source": "systemRef",
      "sourceKind": "refTag",
      "of": "system",
      "tagOn": [
        "equip",
        "point",
        "system"
      ],
      "busPredicate": "bus:memberOf",
      "fidelity": "exact",
      "note": "A system groups without containing, which is exactly bus:hasMember/bus:memberOf."
    },
    {
      "source": "weatherStationRef",
      "sourceKind": "refTag",
      "of": "weatherStation",
      "tagOn": [
        "site",
        "weather-point"
      ],
      "busPredicate": "bus:servedBy",
      "fidelity": "conditional",
      "note": "Rule: on a site, the station serves the site, so emit bus:servedBy from the site (or bus:serves from the station); on a weather-point, the point is part of the station, so emit bus:partOf. Nothing in BUS records that the station is off-premises or a third-party service, which is the fact this tag most often carries.",
      "alternatePredicates": [
        "bus:partOf"
      ]
    }
  ],
  "classificationRule": {
    "system": "haystack",
    "version": "4.0.0",
    "systemTokenIsNormative": true,
    "codeForm": "The def symbol exactly as authored in haystack-defs, without the leading caret: 'ahu', 'chilled-water-plant', 'discharge'. Not the library-qualified form, not the URI, not a display name. Def symbols are unique across the four libraries in 4.0.0, which this generator verifies.",
    "labelForm": "The first line of the def's doc tag, where the exporter carries a label at all. OPTIONAL.",
    "rules": [
      "R1. An exporter MUST emit one classification per applied marker tag that names a def. Tags that name no def are not classifications; they are property values (7.8) or named fields.",
      "R2. An exporter MUST additionally emit one classification for the maximal matched conjunct, where one exists: the declared conjunct whose parts are all present in the applied tag set and which has the most parts. Where two conjuncts tie at the maximum, all tied conjuncts MUST be emitted, because the match is genuinely ambiguous and picking one silently invents a fact.",
      "R3. The maximal-conjunct match MUST exclude the port conjuncts. A port is an interface assertion, not a class: emitting 'air-input' as a classification asserts that an air handler is a kind of air inlet. Ports go to Asset.ports via portMap.",
      "R4. An exporter MUST NOT synthesize a code that is not a def symbol. There is no def for a composed point such as 'discharge air temp sensor' — the maximal match for those four tags is a two-part conjunct — and inventing one violates 7.7-1's verbatim requirement.",
      "R5. Classifications MUST NOT be deduplicated against each other or against the entity's type. An entity may carry the marker code and the conjunct code that contains it; 7.7 permits several from one system and does not adjudicate between them.",
      "R6. The choice-slot options a point carries (pointFunction, ductSection, and the other choice slots) are marker tags and are emitted under R1 like any other. BUS does not model the slot, only the option."
    ],
    "workedExamples": [
      {
        "appliedTags": [
          "discharge",
          "air",
          "temp",
          "sensor"
        ],
        "tagsThatAreDefs": [
          "discharge",
          "air",
          "temp",
          "sensor"
        ],
        "maximalMatchedConjunct": [
          "air-temp"
        ],
        "classificationsEmitted": [
          "air",
          "air-temp",
          "discharge",
          "sensor",
          "temp"
        ],
        "comment": "The canonical case. Four applied tags, four defs, and no def names the composition. The maximal matched conjunct covers only part of the tag set, which is precisely why R4 forbids synthesizing one."
      },
      {
        "appliedTags": [
          "chilled",
          "water",
          "plant"
        ],
        "tagsThatAreDefs": [
          "chilled",
          "water",
          "plant"
        ],
        "maximalMatchedConjunct": [
          "chilled-water-plant"
        ],
        "classificationsEmitted": [
          "chilled",
          "chilled-water-plant",
          "plant",
          "water"
        ],
        "comment": "A declared conjunct exists and covers the whole tag set, so the entity carries four classifications: three markers and the conjunct."
      },
      {
        "appliedTags": [
          "elec",
          "meter"
        ],
        "tagsThatAreDefs": [
          "elec",
          "meter"
        ],
        "maximalMatchedConjunct": [
          "elec-meter"
        ],
        "classificationsEmitted": [
          "elec",
          "elec-meter",
          "meter"
        ],
        "comment": "As above, at two parts."
      },
      {
        "appliedTags": [
          "air",
          "input"
        ],
        "tagsThatAreDefs": [
          "air",
          "input"
        ],
        "maximalMatchedConjunct": [],
        "classificationsEmitted": [
          "air",
          "input"
        ],
        "comment": "R3 in action: the tags do match a declared conjunct, but it is a port conjunct, so no classification is emitted for it and the port goes to Asset.ports instead."
      }
    ],
    "sourceFormCaveat": "Haystack's authored form is not its normalized form. contains, tags and quantities are computedFromReciprocal and never appear in .trio source; inherited tags are derivable but not materialized. An exporter reading a Haystack server through op:defs therefore sees a larger model than one reading source. A conformance claim MUST state which was consumed."
  },
  "portMap": {
    "rule": "A Haystack equipment def declares its ports in its own is list, as conjuncts of the form <substance>-input or <substance>-output. An importer MUST partition the is list into genus and ports before emitting anything, MUST emit each port conjunct as an entry in Asset.ports with name equal to the conjunct symbol, and MUST NOT emit a port conjunct as a classification or an abstractType (8.2). A relationship built from a substance ref tag names those ports in subjectPort and objectPort.",
    "portNameConvention": "Port.name is the Haystack conjunct symbol verbatim, e.g. 'chilled-water-input'. This is derived from a declared type, not invented, so two independent importers produce the same name.",
    "lossiness": "Haystack encodes a port as a supertype, so a def can declare at most one port per medium per direction. A valve's A and B sides on the same medium, an air handler's two return-air inlets, and a coil's supply and return on the same medium are all inexpressible in the source. Port.ordinal and Port.pairedWith exist in BUS to carry exactly those facts, and an importer from Haystack MUST leave both absent: the source does not supply them and synthesizing an ordinal invents topology. This is the one place where BUS v0.3 is strictly more expressive than the source, and the crosswalk cannot fill the gap.",
    "isListHazard": "34 substantive defs declare a port in their is list — the port conjuncts themselves excluded — and 32 of them owe their multiple inheritance entirely to it, meaning that stripping the port leaves a single genuine supertype. A translator that maps each is edge to a classification or an abstractType asserts that an AHU is a kind of air outlet. 8 of these are not in the equip cone — a zone space and the heating and cooling process options — so filtering on 'equipment only' does not save the translator.",
    "defsDeclaringAPort": [
      "actuator",
      "airCooling",
      "airHandlingEquip",
      "airTerminalUnit",
      "battery",
      "boiler",
      "branchSelector",
      "chilled-water-plant",
      "chilledWaterCooling",
      "chiller",
      "circuit",
      "coolingTower",
      "elec-meter",
      "elec-panel",
      "elecHeating",
      "elevator",
      "escalator",
      "evse-equip",
      "fuelOilHeating",
      "fumeHood",
      "hot-water-boiler",
      "hot-water-plant",
      "hotWaterHeating",
      "hvac-zone-space",
      "luminaire",
      "motor",
      "movingWalkway",
      "naturalGasHeating",
      "steam-boiler",
      "steam-plant",
      "steamHeating",
      "vrf-indoorUnit",
      "vrf-outdoorUnit",
      "vrf-refrig-plant"
    ],
    "ports": [
      {
        "source": "air-input",
        "conjunctParts": [
          "air",
          "input"
        ],
        "substance": "air",
        "port": {
          "name": "air-input",
          "direction": "inlet",
          "medium": "air"
        },
        "fidelity": "widening",
        "note": "Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "air-output",
        "conjunctParts": [
          "air",
          "output"
        ],
        "substance": "air",
        "port": {
          "name": "air-output",
          "direction": "outlet",
          "medium": "air"
        },
        "fidelity": "widening",
        "note": "Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "blowdown-water-input",
        "conjunctParts": [
          "blowdown",
          "water",
          "input"
        ],
        "substance": "blowdown-water",
        "port": {
          "name": "blowdown-water-input",
          "direction": "inlet",
          "medium": "water"
        },
        "fidelity": "widening",
        "note": "BUS has no blowdown medium. That the water is boiler or tower blowdown survives only as the source term in Relationship.qualifiers. Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "blowdown-water-output",
        "conjunctParts": [
          "blowdown",
          "water",
          "output"
        ],
        "substance": "blowdown-water",
        "port": {
          "name": "blowdown-water-output",
          "direction": "outlet",
          "medium": "water"
        },
        "fidelity": "widening",
        "note": "BUS has no blowdown medium. That the water is boiler or tower blowdown survives only as the source term in Relationship.qualifiers. Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "chilled-water-input",
        "conjunctParts": [
          "chilled",
          "water",
          "input"
        ],
        "substance": "chilled-water",
        "port": {
          "name": "chilled-water-input",
          "direction": "inlet",
          "medium": "chilledWater"
        },
        "fidelity": "widening",
        "note": "Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "chilled-water-output",
        "conjunctParts": [
          "chilled",
          "water",
          "output"
        ],
        "substance": "chilled-water",
        "port": {
          "name": "chilled-water-output",
          "direction": "outlet",
          "medium": "chilledWater"
        },
        "fidelity": "widening",
        "note": "Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "condensate-input",
        "conjunctParts": [
          "condensate",
          "input"
        ],
        "substance": "condensate",
        "port": {
          "name": "condensate-input",
          "direction": "inlet",
          "medium": "water"
        },
        "fidelity": "widening",
        "note": "Steam condensate. BUS 'steam' names the vapour; the returning liquid is 'water'. The phase relationship between the two edges is not expressible. Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "condensate-output",
        "conjunctParts": [
          "condensate",
          "output"
        ],
        "substance": "condensate",
        "port": {
          "name": "condensate-output",
          "direction": "outlet",
          "medium": "water"
        },
        "fidelity": "widening",
        "note": "Steam condensate. BUS 'steam' names the vapour; the returning liquid is 'water'. The phase relationship between the two edges is not expressible. Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "condenser-water-input",
        "conjunctParts": [
          "condenser",
          "water",
          "input"
        ],
        "substance": "condenser-water",
        "port": {
          "name": "condenser-water-input",
          "direction": "inlet",
          "medium": "condenserWater"
        },
        "fidelity": "widening",
        "note": "Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "condenser-water-output",
        "conjunctParts": [
          "condenser",
          "water",
          "output"
        ],
        "substance": "condenser-water",
        "port": {
          "name": "condenser-water-output",
          "direction": "outlet",
          "medium": "condenserWater"
        },
        "fidelity": "widening",
        "note": "Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "domestic-water-input",
        "conjunctParts": [
          "domestic",
          "water",
          "input"
        ],
        "substance": "domestic-water",
        "port": {
          "name": "domestic-water-input",
          "direction": "inlet",
          "medium": "water"
        },
        "fidelity": "widening",
        "note": "Potability is lost: BUS draws no potable/non-potable distinction. Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "domestic-water-output",
        "conjunctParts": [
          "domestic",
          "water",
          "output"
        ],
        "substance": "domestic-water",
        "port": {
          "name": "domestic-water-output",
          "direction": "outlet",
          "medium": "water"
        },
        "fidelity": "widening",
        "note": "Potability is lost: BUS draws no potable/non-potable distinction. Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "elec-input",
        "conjunctParts": [
          "elec",
          "input"
        ],
        "substance": "elec",
        "port": {
          "name": "elec-input",
          "direction": "inlet",
          "medium": "electricity"
        },
        "fidelity": "widening",
        "note": "Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "elec-output",
        "conjunctParts": [
          "elec",
          "output"
        ],
        "substance": "elec",
        "port": {
          "name": "elec-output",
          "direction": "outlet",
          "medium": "electricity"
        },
        "fidelity": "widening",
        "note": "Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "fuelOil-input",
        "conjunctParts": [
          "fuelOil",
          "input"
        ],
        "substance": "fuelOil",
        "port": {
          "name": "fuelOil-input",
          "direction": "inlet",
          "medium": "fuelOil"
        },
        "fidelity": "widening",
        "note": "Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "fuelOil-output",
        "conjunctParts": [
          "fuelOil",
          "output"
        ],
        "substance": "fuelOil",
        "port": {
          "name": "fuelOil-output",
          "direction": "outlet",
          "medium": "fuelOil"
        },
        "fidelity": "widening",
        "note": "Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "gasoline-input",
        "conjunctParts": [
          "gasoline",
          "input"
        ],
        "substance": "gasoline",
        "port": {
          "name": "gasoline-input",
          "direction": "inlet",
          "medium": "other"
        },
        "fidelity": "none",
        "note": "BUS has no medium for motor fuel. 'fuelOil' is a different substance and MUST NOT be substituted. R8 applies: medium 'other' plus the source term in qualifiers. Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "gasoline-output",
        "conjunctParts": [
          "gasoline",
          "output"
        ],
        "substance": "gasoline",
        "port": {
          "name": "gasoline-output",
          "direction": "outlet",
          "medium": "other"
        },
        "fidelity": "none",
        "note": "BUS has no medium for motor fuel. 'fuelOil' is a different substance and MUST NOT be substituted. R8 applies: medium 'other' plus the source term in qualifiers. Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "hot-water-input",
        "conjunctParts": [
          "hot",
          "water",
          "input"
        ],
        "substance": "hot-water",
        "port": {
          "name": "hot-water-input",
          "direction": "inlet",
          "medium": "hotWater"
        },
        "fidelity": "widening",
        "note": "Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "hot-water-output",
        "conjunctParts": [
          "hot",
          "water",
          "output"
        ],
        "substance": "hot-water",
        "port": {
          "name": "hot-water-output",
          "direction": "outlet",
          "medium": "hotWater"
        },
        "fidelity": "widening",
        "note": "Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "makeup-water-input",
        "conjunctParts": [
          "makeup",
          "water",
          "input"
        ],
        "substance": "makeup-water",
        "port": {
          "name": "makeup-water-input",
          "direction": "inlet",
          "medium": "water"
        },
        "fidelity": "widening",
        "note": "That the water is makeup for a loop is lost from the structural layer. Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "makeup-water-output",
        "conjunctParts": [
          "makeup",
          "water",
          "output"
        ],
        "substance": "makeup-water",
        "port": {
          "name": "makeup-water-output",
          "direction": "outlet",
          "medium": "water"
        },
        "fidelity": "widening",
        "note": "That the water is makeup for a loop is lost from the structural layer. Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "naturalGas-input",
        "conjunctParts": [
          "naturalGas",
          "input"
        ],
        "substance": "naturalGas",
        "port": {
          "name": "naturalGas-input",
          "direction": "inlet",
          "medium": "gas"
        },
        "fidelity": "widening",
        "note": "BUS 'gas' is the generic fuel gas. Natural gas specifically is recoverable only from the classification. Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "naturalGas-output",
        "conjunctParts": [
          "naturalGas",
          "output"
        ],
        "substance": "naturalGas",
        "port": {
          "name": "naturalGas-output",
          "direction": "outlet",
          "medium": "gas"
        },
        "fidelity": "widening",
        "note": "BUS 'gas' is the generic fuel gas. Natural gas specifically is recoverable only from the classification. Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "refrig-input",
        "conjunctParts": [
          "refrig",
          "input"
        ],
        "substance": "refrig",
        "port": {
          "name": "refrig-input",
          "direction": "inlet",
          "medium": "refrigerant"
        },
        "fidelity": "widening",
        "note": "Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "refrig-output",
        "conjunctParts": [
          "refrig",
          "output"
        ],
        "substance": "refrig",
        "port": {
          "name": "refrig-output",
          "direction": "outlet",
          "medium": "refrigerant"
        },
        "fidelity": "widening",
        "note": "Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "steam-input",
        "conjunctParts": [
          "steam",
          "input"
        ],
        "substance": "steam",
        "port": {
          "name": "steam-input",
          "direction": "inlet",
          "medium": "steam"
        },
        "fidelity": "widening",
        "note": "Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      },
      {
        "source": "steam-output",
        "conjunctParts": [
          "steam",
          "output"
        ],
        "substance": "steam",
        "port": {
          "name": "steam-output",
          "direction": "outlet",
          "medium": "steam"
        },
        "fidelity": "widening",
        "note": "Fidelity is at best widening because Haystack's encoding admits one port per medium per direction: the port is a supertype in the equipment def's is list, so a def cannot declare two of them."
      }
    ]
  },
  "mediumMap": {
    "rule": "The 14 flow substances that carry a port conjunct, onto the 13-value BUS Medium enum. A substance whose fidelity is 'none' reaches only 'other': R8's rule applies, and the source term MUST be carried in Relationship.qualifiers.",
    "busMediumValues": [
      "air",
      "water",
      "chilledWater",
      "hotWater",
      "condenserWater",
      "steam",
      "refrigerant",
      "electricity",
      "gas",
      "fuelOil",
      "data",
      "signal",
      "other"
    ],
    "substances": [
      {
        "source": "air",
        "busMedium": "air",
        "fidelity": "exact",
        "portConjuncts": [
          "air-input",
          "air-output"
        ],
        "refTag": "airRef"
      },
      {
        "source": "blowdown-water",
        "busMedium": "water",
        "fidelity": "widening",
        "portConjuncts": [
          "blowdown-water-input",
          "blowdown-water-output"
        ],
        "refTag": "blowdownWaterRef",
        "note": "BUS has no blowdown medium. That the water is boiler or tower blowdown survives only as the source term in Relationship.qualifiers."
      },
      {
        "source": "chilled-water",
        "busMedium": "chilledWater",
        "fidelity": "exact",
        "portConjuncts": [
          "chilled-water-input",
          "chilled-water-output"
        ],
        "refTag": "chilledWaterRef"
      },
      {
        "source": "condensate",
        "busMedium": "water",
        "fidelity": "widening",
        "portConjuncts": [
          "condensate-input",
          "condensate-output"
        ],
        "refTag": "condensateRef",
        "note": "Steam condensate. BUS 'steam' names the vapour; the returning liquid is 'water'. The phase relationship between the two edges is not expressible."
      },
      {
        "source": "condenser-water",
        "busMedium": "condenserWater",
        "fidelity": "exact",
        "portConjuncts": [
          "condenser-water-input",
          "condenser-water-output"
        ],
        "refTag": "condenserWaterRef"
      },
      {
        "source": "domestic-water",
        "busMedium": "water",
        "fidelity": "widening",
        "portConjuncts": [
          "domestic-water-input",
          "domestic-water-output"
        ],
        "refTag": "domesticWaterRef",
        "note": "Potability is lost: BUS draws no potable/non-potable distinction."
      },
      {
        "source": "elec",
        "busMedium": "electricity",
        "fidelity": "exact",
        "portConjuncts": [
          "elec-input",
          "elec-output"
        ],
        "refTag": "elecRef"
      },
      {
        "source": "fuelOil",
        "busMedium": "fuelOil",
        "fidelity": "exact",
        "portConjuncts": [
          "fuelOil-input",
          "fuelOil-output"
        ],
        "refTag": "fuelOilRef"
      },
      {
        "source": "gasoline",
        "busMedium": "other",
        "fidelity": "none",
        "portConjuncts": [
          "gasoline-input",
          "gasoline-output"
        ],
        "refTag": "gasolineRef",
        "note": "BUS has no medium for motor fuel. 'fuelOil' is a different substance and MUST NOT be substituted. R8 applies: medium 'other' plus the source term in qualifiers."
      },
      {
        "source": "hot-water",
        "busMedium": "hotWater",
        "fidelity": "exact",
        "portConjuncts": [
          "hot-water-input",
          "hot-water-output"
        ],
        "refTag": "hotWaterRef"
      },
      {
        "source": "makeup-water",
        "busMedium": "water",
        "fidelity": "widening",
        "portConjuncts": [
          "makeup-water-input",
          "makeup-water-output"
        ],
        "refTag": "makeupWaterRef",
        "note": "That the water is makeup for a loop is lost from the structural layer."
      },
      {
        "source": "naturalGas",
        "busMedium": "gas",
        "fidelity": "widening",
        "portConjuncts": [
          "naturalGas-input",
          "naturalGas-output"
        ],
        "refTag": "naturalGasRef",
        "note": "BUS 'gas' is the generic fuel gas. Natural gas specifically is recoverable only from the classification."
      },
      {
        "source": "refrig",
        "busMedium": "refrigerant",
        "fidelity": "exact",
        "portConjuncts": [
          "refrig-input",
          "refrig-output"
        ],
        "refTag": "refrigRef"
      },
      {
        "source": "steam",
        "busMedium": "steam",
        "fidelity": "exact",
        "portConjuncts": [
          "steam-input",
          "steam-output"
        ],
        "refTag": "steamRef"
      }
    ],
    "reachOnlyOther": [
      "gasoline"
    ],
    "note": "Haystack's wider ^substance cone is 46 defs. Only the 14 that carry a port conjunct can appear on a flow edge, so only those are mapped here; the rest are point subjects and reach BUS as classifications or as a PropertyDefinition, not as a medium."
  },
  "unitMap": {
    "rule": "A Haystack unit is a str tag naming a unit in the Fantom unit database, and a Zinc number repeats it inline. An importer MUST match on the unit symbol first and on the unit name second, MUST NOT convert the value (7.4-1), and where no BUS code matches MUST set unitSystem 'haystack' and carry the Haystack symbol verbatim in unitCode (7.4).",
    "busUnitsFileCarriesPerUnitHaystack": false,
    "busUnitsFileNote": "bus-units.json carries a per-unit 'ucum' field only; its externalSystems block names haystack, bacnet and qudt as escape systems but no per-unit code for any of them. This file therefore supplies the haystack column rather than referencing it. Fields present per unit in bus-units.json: code, label, note, quantity, ucum.",
    "busCodeToHaystack": [
      {
        "busCode": "A",
        "haystackUnit": "ampere",
        "haystackSymbols": [
          "A"
        ],
        "haystackQuantity": "electric current"
      },
      {
        "busCode": "Btu",
        "haystackUnit": "btu",
        "haystackSymbols": [
          "BTU"
        ],
        "haystackQuantity": "energy"
      },
      {
        "busCode": "Btu/h",
        "haystackUnit": "btus_per_hour",
        "haystackSymbols": [
          "BTU/h"
        ],
        "haystackQuantity": "power"
      },
      {
        "busCode": "Hz",
        "haystackUnit": "hertz",
        "haystackSymbols": [
          "Hz"
        ],
        "haystackQuantity": "frequency"
      },
      {
        "busCode": "J",
        "haystackUnit": "joule",
        "haystackSymbols": [
          "J"
        ],
        "haystackQuantity": "energy"
      },
      {
        "busCode": "K",
        "haystackUnit": "kelvin",
        "haystackSymbols": [
          "K"
        ],
        "haystackQuantity": "temperature"
      },
      {
        "busCode": "L",
        "haystackUnit": "liter",
        "haystackSymbols": [
          "L"
        ],
        "haystackQuantity": "volume"
      },
      {
        "busCode": "L/s",
        "haystackUnit": "liters_per_second",
        "haystackSymbols": [
          "L/s"
        ],
        "haystackQuantity": "volumetric flow"
      },
      {
        "busCode": "MBtu/h",
        "haystackUnit": "megabtus_per_hour",
        "haystackSymbols": [
          "MBTU/h",
          "MMBTU/h"
        ],
        "haystackQuantity": "power",
        "note": "Haystack's megabtus_per_hour carries symbols MBTU/h and MMBTU/h. BUS MBtu/h means one million Btu per hour, matching the value not the ambiguous US convention where M is a thousand."
      },
      {
        "busCode": "MJ",
        "haystackUnit": "megajoule",
        "haystackSymbols": [
          "MJ"
        ],
        "haystackQuantity": "energy"
      },
      {
        "busCode": "MW",
        "haystackUnit": "megawatt",
        "haystackSymbols": [
          "MW"
        ],
        "haystackQuantity": "power"
      },
      {
        "busCode": "MWh",
        "haystackUnit": "megawatt_hour",
        "haystackSymbols": [
          "MWh"
        ],
        "haystackQuantity": "energy"
      },
      {
        "busCode": "Pa",
        "haystackUnit": "pascal",
        "haystackSymbols": [
          "Pa"
        ],
        "haystackQuantity": "pressure"
      },
      {
        "busCode": "V",
        "haystackUnit": "volt",
        "haystackSymbols": [
          "Volt",
          "V"
        ],
        "haystackQuantity": "electric potential"
      },
      {
        "busCode": "W",
        "haystackUnit": "watt",
        "haystackSymbols": [
          "W"
        ],
        "haystackQuantity": "power"
      },
      {
        "busCode": "Wh",
        "haystackUnit": "watt_hour",
        "haystackSymbols": [
          "Wh"
        ],
        "haystackQuantity": "energy"
      },
      {
        "busCode": "bar",
        "haystackUnit": "bar",
        "haystackSymbols": [],
        "haystackQuantity": "pressure"
      },
      {
        "busCode": "cfm",
        "haystackUnit": "cubic_feet_per_minute",
        "haystackSymbols": [
          "cfm"
        ],
        "haystackQuantity": "volumetric flow"
      },
      {
        "busCode": "dB",
        "haystackUnit": "decibel",
        "haystackSymbols": [
          "db"
        ],
        "haystackQuantity": "dimensionless"
      },
      {
        "busCode": "day",
        "haystackUnit": "day",
        "haystackSymbols": [],
        "haystackQuantity": "time"
      },
      {
        "busCode": "deg",
        "haystackUnit": "degrees_angular",
        "haystackSymbols": [
          "deg"
        ],
        "haystackQuantity": "dimensionless"
      },
      {
        "busCode": "degC",
        "haystackUnit": "celsius",
        "haystackSymbols": [
          "°C"
        ],
        "haystackQuantity": "temperature"
      },
      {
        "busCode": "degF",
        "haystackUnit": "fahrenheit",
        "haystackSymbols": [
          "°F"
        ],
        "haystackQuantity": "temperature"
      },
      {
        "busCode": "deltaDegC",
        "haystackUnit": "celsius_degrees",
        "haystackSymbols": [
          "Δ°C"
        ],
        "haystackQuantity": "temperature differential"
      },
      {
        "busCode": "deltaDegF",
        "haystackUnit": "fahrenheit_degrees",
        "haystackSymbols": [
          "Δ°F"
        ],
        "haystackQuantity": "temperature differential"
      },
      {
        "busCode": "fc",
        "haystackUnit": "footcandle",
        "haystackSymbols": [
          "fc"
        ],
        "haystackQuantity": "illuminance"
      },
      {
        "busCode": "fpm",
        "haystackUnit": "feet_per_minute",
        "haystackSymbols": [
          "ft/min"
        ],
        "haystackQuantity": "velocity"
      },
      {
        "busCode": "ft",
        "haystackUnit": "foot",
        "haystackSymbols": [
          "ft"
        ],
        "haystackQuantity": "length"
      },
      {
        "busCode": "ft2",
        "haystackUnit": "square_foot",
        "haystackSymbols": [
          "ft²"
        ],
        "haystackQuantity": "area"
      },
      {
        "busCode": "ft3",
        "haystackUnit": "cubic_foot",
        "haystackSymbols": [
          "ft³"
        ],
        "haystackQuantity": "volume"
      },
      {
        "busCode": "gPerKg",
        "haystackUnit": "grams_of_water_per_kilogram_dry_air",
        "haystackSymbols": [
          "gH₂O/kgAir"
        ],
        "haystackQuantity": "dimensionless",
        "note": "Haystack also has the plain grams_per_kilogram (g/kg). The psychrometric form is the correct target for the BUS code, whose label is 'grams of water per kilogram of dry air'."
      },
      {
        "busCode": "gal",
        "haystackUnit": "gallon",
        "haystackSymbols": [
          "gal"
        ],
        "haystackQuantity": "volume"
      },
      {
        "busCode": "gpm",
        "haystackUnit": "gallons_per_minute",
        "haystackSymbols": [
          "gal/min"
        ],
        "haystackQuantity": "volumetric flow"
      },
      {
        "busCode": "h",
        "haystackUnit": "hour",
        "haystackSymbols": [
          "h",
          "hr"
        ],
        "haystackQuantity": "time"
      },
      {
        "busCode": "hp",
        "haystackUnit": "horsepower",
        "haystackSymbols": [
          "hp"
        ],
        "haystackQuantity": "power"
      },
      {
        "busCode": "in",
        "haystackUnit": "inch",
        "haystackSymbols": [
          "in"
        ],
        "haystackQuantity": "length"
      },
      {
        "busCode": "inH2O",
        "haystackUnit": "inches_of_water",
        "haystackSymbols": [
          "in/wc",
          "inH₂O"
        ],
        "haystackQuantity": "pressure"
      },
      {
        "busCode": "inHg",
        "haystackUnit": "inches_of_mercury",
        "haystackSymbols": [
          "inHg"
        ],
        "haystackQuantity": "pressure"
      },
      {
        "busCode": "kPa",
        "haystackUnit": "kilopascal",
        "haystackSymbols": [
          "kPa"
        ],
        "haystackQuantity": "pressure"
      },
      {
        "busCode": "kVA",
        "haystackUnit": "kilovolt_ampere",
        "haystackSymbols": [
          "kVA"
        ],
        "haystackQuantity": "apparent power"
      },
      {
        "busCode": "kVAR",
        "haystackUnit": "kilovolt_ampere_reactive",
        "haystackSymbols": [
          "kVAR"
        ],
        "haystackQuantity": "reactive power"
      },
      {
        "busCode": "kW",
        "haystackUnit": "kilowatt",
        "haystackSymbols": [
          "kW"
        ],
        "haystackQuantity": "power"
      },
      {
        "busCode": "kWh",
        "haystackUnit": "kilowatt_hour",
        "haystackSymbols": [
          "kWh"
        ],
        "haystackQuantity": "energy"
      },
      {
        "busCode": "kg",
        "haystackUnit": "kilogram",
        "haystackSymbols": [
          "kg"
        ],
        "haystackQuantity": "mass"
      },
      {
        "busCode": "kg/s",
        "haystackUnit": "kilograms_per_second",
        "haystackSymbols": [
          "kg/s"
        ],
        "haystackQuantity": "mass flow"
      },
      {
        "busCode": "lb",
        "haystackUnit": "pound",
        "haystackSymbols": [
          "lb"
        ],
        "haystackQuantity": "mass"
      },
      {
        "busCode": "lb/h",
        "haystackUnit": "pounds_per_hour",
        "haystackSymbols": [
          "lb/h"
        ],
        "haystackQuantity": "mass flow"
      },
      {
        "busCode": "lux",
        "haystackUnit": "lux",
        "haystackSymbols": [
          "lx"
        ],
        "haystackQuantity": "illuminance"
      },
      {
        "busCode": "m",
        "haystackUnit": "meter",
        "haystackSymbols": [
          "m"
        ],
        "haystackQuantity": "length"
      },
      {
        "busCode": "m/s",
        "haystackUnit": "meters_per_second",
        "haystackSymbols": [
          "m/s"
        ],
        "haystackQuantity": "velocity"
      },
      {
        "busCode": "m2",
        "haystackUnit": "square_meter",
        "haystackSymbols": [
          "m²"
        ],
        "haystackQuantity": "area"
      },
      {
        "busCode": "m3",
        "haystackUnit": "cubic_meter",
        "haystackSymbols": [
          "m³"
        ],
        "haystackQuantity": "volume"
      },
      {
        "busCode": "m3/h",
        "haystackUnit": "cubic_meters_per_hour",
        "haystackSymbols": [
          "m³/h"
        ],
        "haystackQuantity": "volumetric flow"
      },
      {
        "busCode": "m3/s",
        "haystackUnit": "cubic_meters_per_second",
        "haystackSymbols": [
          "m³/s"
        ],
        "haystackQuantity": "volumetric flow"
      },
      {
        "busCode": "mg/m3",
        "haystackUnit": "milligrams_per_cubic_meter",
        "haystackSymbols": [
          "mg/m³"
        ],
        "haystackQuantity": "density"
      },
      {
        "busCode": "min",
        "haystackUnit": "minute",
        "haystackSymbols": [
          "min"
        ],
        "haystackQuantity": "time"
      },
      {
        "busCode": "mm",
        "haystackUnit": "millimeter",
        "haystackSymbols": [
          "mm"
        ],
        "haystackQuantity": "length"
      },
      {
        "busCode": "ms",
        "haystackUnit": "millisecond",
        "haystackSymbols": [
          "ms"
        ],
        "haystackQuantity": "time"
      },
      {
        "busCode": "ohm",
        "haystackUnit": "ohm",
        "haystackSymbols": [
          "Ω",
          "Ω"
        ],
        "haystackQuantity": "electric resistance"
      },
      {
        "busCode": "pct",
        "haystackUnit": "percent",
        "haystackSymbols": [
          "%"
        ],
        "haystackQuantity": "dimensionless"
      },
      {
        "busCode": "pctRH",
        "haystackUnit": "percent_relative_humidity",
        "haystackSymbols": [
          "%RH"
        ],
        "haystackQuantity": "dimensionless"
      },
      {
        "busCode": "pf",
        "haystackUnit": "power_factor",
        "haystackSymbols": [
          "pf"
        ],
        "haystackQuantity": "dimensionless"
      },
      {
        "busCode": "ppb",
        "haystackUnit": "parts_per_billion",
        "haystackSymbols": [
          "ppb"
        ],
        "haystackQuantity": "dimensionless"
      },
      {
        "busCode": "ppm",
        "haystackUnit": "parts_per_million",
        "haystackSymbols": [
          "ppm"
        ],
        "haystackQuantity": "dimensionless"
      },
      {
        "busCode": "psi",
        "haystackUnit": "pounds_per_square_inch",
        "haystackSymbols": [
          "psi"
        ],
        "haystackQuantity": "pressure"
      },
      {
        "busCode": "rad",
        "haystackUnit": "radian",
        "haystackSymbols": [
          "rad"
        ],
        "haystackQuantity": "dimensionless"
      },
      {
        "busCode": "ratio",
        "haystackUnit": "parts_per_unit",
        "haystackSymbols": [
          "ppu"
        ],
        "haystackQuantity": "dimensionless",
        "note": "Haystack parts_per_unit (ppu) is dimensionless with scale 1, as bus:ratio is. The tokens differ; the quantity does not."
      },
      {
        "busCode": "rpm",
        "haystackUnit": "revolutions_per_minute",
        "haystackSymbols": [
          "rpm"
        ],
        "haystackQuantity": "angular velocity"
      },
      {
        "busCode": "s",
        "haystackUnit": "second",
        "haystackSymbols": [
          "s",
          "sec"
        ],
        "haystackQuantity": "time"
      },
      {
        "busCode": "therm",
        "haystackUnit": "therm",
        "haystackSymbols": [],
        "haystackQuantity": "energy"
      },
      {
        "busCode": "tonHours",
        "haystackUnit": "tons_refrigeration_hour",
        "haystackSymbols": [
          "tonrefh"
        ],
        "haystackQuantity": "energy"
      },
      {
        "busCode": "tonRef",
        "haystackUnit": "tons_refrigeration",
        "haystackSymbols": [
          "tonref"
        ],
        "haystackQuantity": "power",
        "note": "bus-units.json notes of tonRef that 'no equivalent exists in any external registry surveyed'. The Fantom unit database that Haystack delegates to has tons_refrigeration (tonref), and tons_refrigeration_hour for tonHours. The note is an editorial error and should be corrected when Annex C is next open."
      },
      {
        "busCode": "ug/m3",
        "haystackUnit": "micrograms_per_cubic_meter",
        "haystackSymbols": [
          "µg/m³"
        ],
        "haystackQuantity": "density"
      },
      {
        "busCode": "yr",
        "haystackUnit": "year",
        "haystackSymbols": [
          "yr"
        ],
        "haystackQuantity": "time"
      }
    ],
    "busCodesWithNoHaystackUnit": [
      {
        "busCode": "count",
        "reason": "The Fantom unit database has no unit for a bare count."
      },
      {
        "busCode": "dBA",
        "reason": "Haystack has 'decibel' (db) but no A-weighted form. Mapping dBA onto decibel would drop the weighting, which is the whole content of the code."
      },
      {
        "busCode": "grPerLb",
        "reason": "The Fantom unit database has no grains-of-water unit; its psychrometric humidity ratio is metric only."
      }
    ],
    "haystackUnitsWithNoBusCode": [
      {
        "haystackUnit": "acre",
        "symbols": [],
        "quantity": "area"
      },
      {
        "haystackUnit": "afghani",
        "symbols": [
          "AFN",
          "Af"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "air_changes_per_hour",
        "symbols": [
          "ACH"
        ],
        "quantity": "frequency"
      },
      {
        "haystackUnit": "algerian_dinar",
        "symbols": [
          "DZD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "ampere_hour",
        "symbols": [
          "Ah"
        ],
        "quantity": "electric charge"
      },
      {
        "haystackUnit": "ampere_square_meter",
        "symbols": [
          "Am²"
        ],
        "quantity": "electromagnetic moment"
      },
      {
        "haystackUnit": "amperes_per_meter",
        "symbols": [
          "A/m"
        ],
        "quantity": "magnetic field strength"
      },
      {
        "haystackUnit": "amperes_per_square_meter",
        "symbols": [
          "A/m²"
        ],
        "quantity": "electric current density"
      },
      {
        "haystackUnit": "argentine_peso",
        "symbols": [
          "ARS"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "armenian_dram",
        "symbols": [
          "AMD",
          "Դ"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "aruban_guilder_florin",
        "symbols": [
          "AWG",
          "ƒ"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "atmosphere",
        "symbols": [
          "atm"
        ],
        "quantity": "pressure"
      },
      {
        "haystackUnit": "australian_dollar",
        "symbols": [
          "AUD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "azerbaijanian_manat",
        "symbols": [
          "AZN",
          "ман"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "bahamian_dollar",
        "symbols": [
          "BSD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "bahraini_dinar",
        "symbols": [
          "BHD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "baht",
        "symbols": [
          "THB",
          "฿"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "balboa",
        "symbols": [
          "PAB"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "barbados_dollar",
        "symbols": [
          "BBD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "belarussian_ruble",
        "symbols": [
          "BYR",
          "Br"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "belize_dollar",
        "symbols": [
          "BZD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "bermudian_dollar",
        "symbols": [
          "BMD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "bolivar_fuerte",
        "symbols": [
          "VEF"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "boliviano",
        "symbols": [
          "BOB"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "brazilian_real",
        "symbols": [
          "BRL",
          "R$"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "brunei_dollar",
        "symbols": [
          "BND"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "btu_per_pound",
        "symbols": [
          "BTU/lb"
        ],
        "quantity": "enthalpy"
      },
      {
        "haystackUnit": "btu_per_square_foot",
        "symbols": [
          "BTU/ft²"
        ],
        "quantity": "energy by area"
      },
      {
        "haystackUnit": "btus_per_pound_dry_air",
        "symbols": [
          "btu/lb_dry"
        ],
        "quantity": "enthalpy"
      },
      {
        "haystackUnit": "bulgarian_lev",
        "symbols": [
          "BGN",
          "лв"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "burundi_franc",
        "symbols": [
          "BIF"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "byte",
        "symbols": [],
        "quantity": "bytes"
      },
      {
        "haystackUnit": "calorie",
        "symbols": [
          "cal"
        ],
        "quantity": "energy"
      },
      {
        "haystackUnit": "calorie_per_gram",
        "symbols": [
          "cal/g"
        ],
        "quantity": "enthalpy"
      },
      {
        "haystackUnit": "canadian_dollar",
        "symbols": [
          "CAD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "candela",
        "symbols": [
          "cd"
        ],
        "quantity": "luminous intensity"
      },
      {
        "haystackUnit": "candelas_per_square_meter",
        "symbols": [
          "cd/m²"
        ],
        "quantity": "luminance"
      },
      {
        "haystackUnit": "candels_per_square_foot",
        "symbols": [
          "cd/ft²"
        ],
        "quantity": "luminance"
      },
      {
        "haystackUnit": "cape_verde_escudo",
        "symbols": [
          "CVE"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "cayman_islands_dollar",
        "symbols": [
          "KYD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "cedi",
        "symbols": [
          "GHS",
          "₵"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "centimeter",
        "symbols": [
          "cm"
        ],
        "quantity": "length"
      },
      {
        "haystackUnit": "centimeters_of_mercury",
        "symbols": [
          "cmHg"
        ],
        "quantity": "pressure"
      },
      {
        "haystackUnit": "centimeters_of_water",
        "symbols": [
          "cmH₂O"
        ],
        "quantity": "pressure"
      },
      {
        "haystackUnit": "centum_cubic_feet",
        "symbols": [
          "Ccf"
        ],
        "quantity": "volume"
      },
      {
        "haystackUnit": "centum_cubic_feet_natural_gas",
        "symbols": [
          "Ccf_natural_gas"
        ],
        "quantity": "energy"
      },
      {
        "haystackUnit": "cfa_franc_bceao",
        "symbols": [
          "XAF"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "cfp_franc",
        "symbols": [
          "XPF"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "chilean_peso",
        "symbols": [
          "CLP"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "chinese_yuan",
        "symbols": [
          "CNY",
          "元"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "coefficient_of_performance",
        "symbols": [
          "COP"
        ],
        "quantity": "cooling efficiency"
      },
      {
        "haystackUnit": "congolese_franc",
        "symbols": [
          "CDF"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "cordoba_oro",
        "symbols": [
          "NIO",
          "C$"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "costa_rican_colon",
        "symbols": [
          "CRC",
          "₡"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "coulomb",
        "symbols": [
          "C"
        ],
        "quantity": "electric charge"
      },
      {
        "haystackUnit": "croatian_kuna",
        "symbols": [
          "HRK",
          "Kn"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "cuban_peso",
        "symbols": [
          "CUP"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "cubic_centimeter",
        "symbols": [
          "cm³"
        ],
        "quantity": "volume"
      },
      {
        "haystackUnit": "cubic_feet_natural_gas",
        "symbols": [
          "standard_cubic_foot",
          "scf",
          "ft³_gas"
        ],
        "quantity": "energy"
      },
      {
        "haystackUnit": "cubic_feet_per_hour",
        "symbols": [
          "cfh"
        ],
        "quantity": "volumetric flow"
      },
      {
        "haystackUnit": "cubic_feet_per_minute_per_square_foot",
        "symbols": [
          "cfm/ft²"
        ],
        "quantity": "velocity"
      },
      {
        "haystackUnit": "cubic_feet_per_second",
        "symbols": [
          "cfs"
        ],
        "quantity": "volumetric flow"
      },
      {
        "haystackUnit": "cubic_inch",
        "symbols": [
          "in³"
        ],
        "quantity": "volume"
      },
      {
        "haystackUnit": "cubic_meters_natural_gas",
        "symbols": [
          "standard_cubic_meter",
          "scm",
          "m³_gas"
        ],
        "quantity": "energy"
      },
      {
        "haystackUnit": "cubic_meters_per_minute",
        "symbols": [
          "m³/min"
        ],
        "quantity": "volumetric flow"
      },
      {
        "haystackUnit": "cubic_millimeter",
        "symbols": [
          "mm³"
        ],
        "quantity": "volume"
      },
      {
        "haystackUnit": "cubic_yard",
        "symbols": [
          "yd³"
        ],
        "quantity": "volume"
      },
      {
        "haystackUnit": "cycles_per_hour",
        "symbols": [
          "cph"
        ],
        "quantity": "frequency"
      },
      {
        "haystackUnit": "cycles_per_minute",
        "symbols": [
          "cpm"
        ],
        "quantity": "frequency"
      },
      {
        "haystackUnit": "czech_koruna",
        "symbols": [
          "CZK",
          "Kč"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "dalasi",
        "symbols": [
          "GMD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "danish_krone",
        "symbols": [
          "DKK",
          "kr"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "data_center_infrastructure_efficiency",
        "symbols": [
          "DCIE"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "db_microvolt",
        "symbols": [
          "dBµV"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "db_millivolt",
        "symbols": [
          "dBmV"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "degree_days_celsius",
        "symbols": [
          "°daysC"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "degree_days_fahrenheit",
        "symbols": [
          "°daysF"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "degrees_celsius_per_hour",
        "symbols": [
          "°C/h"
        ],
        "quantity": "heating rate"
      },
      {
        "haystackUnit": "degrees_celsius_per_minute",
        "symbols": [
          "°C/min"
        ],
        "quantity": "heating rate"
      },
      {
        "haystackUnit": "degrees_fahrenheit_per_hour",
        "symbols": [
          "°F/h"
        ],
        "quantity": "heating rate"
      },
      {
        "haystackUnit": "degrees_fahrenheit_per_minute",
        "symbols": [
          "°F/min"
        ],
        "quantity": "heating rate"
      },
      {
        "haystackUnit": "degrees_kelvin_per_hour",
        "symbols": [
          "K/h"
        ],
        "quantity": "heating rate"
      },
      {
        "haystackUnit": "degrees_kelvin_per_minute",
        "symbols": [
          "K/min"
        ],
        "quantity": "heating rate"
      },
      {
        "haystackUnit": "degrees_kelvin_per_second",
        "symbols": [
          "K/s"
        ],
        "quantity": "heating rate"
      },
      {
        "haystackUnit": "degrees_phase",
        "symbols": [
          "degPh"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "denar",
        "symbols": [
          "MKD",
          "ден"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "djibouti_franc",
        "symbols": [
          "DJF"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "dobra",
        "symbols": [
          "STD",
          "Db"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "dominican_peso",
        "symbols": [
          "DOP"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "dong",
        "symbols": [
          "VND",
          "₫"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "east_caribbean_dollar",
        "symbols": [
          "XCD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "egyptian_pound",
        "symbols": [
          "EGP"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "energy_efficiency_ratio",
        "symbols": [
          "Btu/Wh",
          "EER"
        ],
        "quantity": "cooling efficiency"
      },
      {
        "haystackUnit": "ethiopian_birr",
        "symbols": [
          "ETB"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "euro",
        "symbols": [
          "EUR",
          "€"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "falkland_islands_pound",
        "symbols": [
          "FKP"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "farad",
        "symbols": [
          "F"
        ],
        "quantity": "capacitance"
      },
      {
        "haystackUnit": "feet_per_second",
        "symbols": [
          "ft/s"
        ],
        "quantity": "velocity"
      },
      {
        "haystackUnit": "fiji_dollar",
        "symbols": [
          "FJD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "fluid_ounce",
        "symbols": [
          "fl_oz"
        ],
        "quantity": "volume"
      },
      {
        "haystackUnit": "foot_pounds_per_second",
        "symbols": [
          "ftlbs/sec"
        ],
        "quantity": "power"
      },
      {
        "haystackUnit": "forint",
        "symbols": [
          "HUF"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "formazin_nephelometric_unit",
        "symbols": [
          "fnu"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "gallons_per_hour",
        "symbols": [
          "gal/hr",
          "gph"
        ],
        "quantity": "volumetric flow"
      },
      {
        "haystackUnit": "gibraltar_pound",
        "symbols": [
          "GIP"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "gigabyte",
        "symbols": [
          "GB"
        ],
        "quantity": "bytes"
      },
      {
        "haystackUnit": "gigajoule",
        "symbols": [
          "GJ"
        ],
        "quantity": "energy"
      },
      {
        "haystackUnit": "gigajoules_per_cubic_meter",
        "symbols": [
          "GJ/m³"
        ],
        "quantity": "energy by volume"
      },
      {
        "haystackUnit": "gigajoules_per_hour",
        "symbols": [
          "GJ/h"
        ],
        "quantity": "power"
      },
      {
        "haystackUnit": "gigawatt",
        "symbols": [
          "GW"
        ],
        "quantity": "power"
      },
      {
        "haystackUnit": "gigawatt_hour",
        "symbols": [
          "GWh"
        ],
        "quantity": "energy"
      },
      {
        "haystackUnit": "gourde",
        "symbols": [
          "HTG"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "gram",
        "symbols": [
          "g"
        ],
        "quantity": "mass"
      },
      {
        "haystackUnit": "grams_per_cubic_meter",
        "symbols": [
          "g/m³"
        ],
        "quantity": "density"
      },
      {
        "haystackUnit": "grams_per_kilogram",
        "symbols": [
          "g/kg"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "grams_per_minute",
        "symbols": [
          "g/min"
        ],
        "quantity": "mass flow"
      },
      {
        "haystackUnit": "grams_per_second",
        "symbols": [
          "g/s"
        ],
        "quantity": "mass flow"
      },
      {
        "haystackUnit": "grams_per_square_meter",
        "symbols": [
          "g/m²"
        ],
        "quantity": "grammage"
      },
      {
        "haystackUnit": "guarani",
        "symbols": [
          "PYG",
          "₲"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "guinea_franc",
        "symbols": [
          "GNF"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "guyana_dollar",
        "symbols": [
          "GYD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "hecto_cubic_foot",
        "symbols": [
          "hft³"
        ],
        "quantity": "volume"
      },
      {
        "haystackUnit": "hectoliter",
        "symbols": [
          "hL"
        ],
        "quantity": "volume"
      },
      {
        "haystackUnit": "hectoliters_per_second",
        "symbols": [
          "hL/s"
        ],
        "quantity": "volumetric flow"
      },
      {
        "haystackUnit": "hectopascal",
        "symbols": [
          "hPa"
        ],
        "quantity": "pressure"
      },
      {
        "haystackUnit": "henry",
        "symbols": [
          "H"
        ],
        "quantity": "inductance"
      },
      {
        "haystackUnit": "hong_kong_dollar",
        "symbols": [
          "HKD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "horsepower_hour",
        "symbols": [
          "hph"
        ],
        "quantity": "energy"
      },
      {
        "haystackUnit": "hryvnia",
        "symbols": [
          "UAH",
          "₴"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "hundred_cubic_feet",
        "symbols": [
          "Hcf"
        ],
        "quantity": "volume"
      },
      {
        "haystackUnit": "hundred_cubic_feet_natural_gas",
        "symbols": [
          "Hcf_natural_gas"
        ],
        "quantity": "energy"
      },
      {
        "haystackUnit": "hundredths_second",
        "symbols": [
          "cs"
        ],
        "quantity": "time"
      },
      {
        "haystackUnit": "iceland_krona",
        "symbols": [
          "ISK",
          "Kr"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "imperial_gallon",
        "symbols": [
          "galUK"
        ],
        "quantity": "volume"
      },
      {
        "haystackUnit": "imperial_gallons_per_minute",
        "symbols": [
          "galUK/min"
        ],
        "quantity": "volumetric flow"
      },
      {
        "haystackUnit": "inches_per_hour",
        "symbols": [
          "in/h"
        ],
        "quantity": "velocity"
      },
      {
        "haystackUnit": "indian_rupee",
        "symbols": [
          "INR",
          "₹"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "iranian_rial",
        "symbols": [
          "IRR"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "iraqi_dinar",
        "symbols": [
          "IQD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "jamaican_dollar",
        "symbols": [
          "JMD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "jordanian_dinar",
        "symbols": [
          "JOD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "joule_second",
        "symbols": [
          "Js"
        ],
        "quantity": "angular momentum"
      },
      {
        "haystackUnit": "joules_per_cubic_meter",
        "symbols": [
          "J/m³"
        ],
        "quantity": "energy by volume"
      },
      {
        "haystackUnit": "joules_per_degree_kelvin",
        "symbols": [
          "J/°K"
        ],
        "quantity": "entropy"
      },
      {
        "haystackUnit": "joules_per_gram",
        "symbols": [
          "J/g"
        ],
        "quantity": "enthalpy"
      },
      {
        "haystackUnit": "joules_per_hour",
        "symbols": [
          "J/h"
        ],
        "quantity": "power"
      },
      {
        "haystackUnit": "joules_per_kilogram",
        "symbols": [
          "J/kg"
        ],
        "quantity": "enthalpy"
      },
      {
        "haystackUnit": "joules_per_kilogram_degree_kelvin",
        "symbols": [
          "J/kg°K"
        ],
        "quantity": "specific entropy"
      },
      {
        "haystackUnit": "joules_per_kilogram_dry_air",
        "symbols": [
          "J/kg_dry"
        ],
        "quantity": "enthalpy"
      },
      {
        "haystackUnit": "joules_per_square_meter",
        "symbols": [
          "J/m²"
        ],
        "quantity": "energy by area"
      },
      {
        "haystackUnit": "julian_month",
        "symbols": [
          "mo"
        ],
        "quantity": "time"
      },
      {
        "haystackUnit": "kelvin_degrees",
        "symbols": [
          "ΔK"
        ],
        "quantity": "temperature differential"
      },
      {
        "haystackUnit": "kenyan_shilling",
        "symbols": [
          "KES",
          "Sh"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "kilobtu",
        "symbols": [
          "kBTU"
        ],
        "quantity": "energy"
      },
      {
        "haystackUnit": "kilobtu_per_square_foot",
        "symbols": [
          "kBTU/ft²"
        ],
        "quantity": "energy by area"
      },
      {
        "haystackUnit": "kilobtus_per_hour",
        "symbols": [
          "kBTU/h"
        ],
        "quantity": "power"
      },
      {
        "haystackUnit": "kilobtus_per_hour_per_square_foot",
        "symbols": [
          "kBTU/h/ft²"
        ],
        "quantity": "power by area"
      },
      {
        "haystackUnit": "kilobyte",
        "symbols": [
          "kB"
        ],
        "quantity": "bytes"
      },
      {
        "haystackUnit": "kilocubic_feet_per_minute",
        "symbols": [
          "kcfm"
        ],
        "quantity": "volumetric flow"
      },
      {
        "haystackUnit": "kilogallon",
        "symbols": [
          "kgal"
        ],
        "quantity": "volume"
      },
      {
        "haystackUnit": "kilograms_per_cubic_meter",
        "symbols": [
          "kg/m³"
        ],
        "quantity": "density"
      },
      {
        "haystackUnit": "kilograms_per_hour",
        "symbols": [
          "kg/h"
        ],
        "quantity": "mass flow"
      },
      {
        "haystackUnit": "kilograms_per_liter",
        "symbols": [
          "kg/L"
        ],
        "quantity": "density"
      },
      {
        "haystackUnit": "kilograms_per_minute",
        "symbols": [
          "kg/min"
        ],
        "quantity": "mass flow"
      },
      {
        "haystackUnit": "kilograms_per_square_meter",
        "symbols": [
          "kg/m²"
        ],
        "quantity": "grammage"
      },
      {
        "haystackUnit": "kilohertz",
        "symbols": [
          "kHz"
        ],
        "quantity": "frequency"
      },
      {
        "haystackUnit": "kilohm",
        "symbols": [
          "kΩ",
          "kΩ"
        ],
        "quantity": "electric resistance"
      },
      {
        "haystackUnit": "kilojoule",
        "symbols": [
          "kJ"
        ],
        "quantity": "energy"
      },
      {
        "haystackUnit": "kilojoules_per_degree_kelvin",
        "symbols": [
          "kJ/°K"
        ],
        "quantity": "entropy"
      },
      {
        "haystackUnit": "kilojoules_per_hour",
        "symbols": [
          "kJ/h"
        ],
        "quantity": "power"
      },
      {
        "haystackUnit": "kilojoules_per_kilogram",
        "symbols": [
          "kJ/kg"
        ],
        "quantity": "enthalpy"
      },
      {
        "haystackUnit": "kilojoules_per_kilogram_dry_air",
        "symbols": [
          "kJ/kg_dry"
        ],
        "quantity": "enthalpy"
      },
      {
        "haystackUnit": "kiloliter",
        "symbols": [
          "kL"
        ],
        "quantity": "volume"
      },
      {
        "haystackUnit": "kilometer",
        "symbols": [
          "km"
        ],
        "quantity": "length"
      },
      {
        "haystackUnit": "kilometers_per_hour",
        "symbols": [
          "km/h"
        ],
        "quantity": "velocity"
      },
      {
        "haystackUnit": "kilometers_per_second",
        "symbols": [
          "km/s"
        ],
        "quantity": "velocity"
      },
      {
        "haystackUnit": "kilopound",
        "symbols": [
          "klb"
        ],
        "quantity": "mass"
      },
      {
        "haystackUnit": "kilopounds_per_hour",
        "symbols": [
          "klb/h"
        ],
        "quantity": "mass flow"
      },
      {
        "haystackUnit": "kilovolt",
        "symbols": [
          "kV"
        ],
        "quantity": "electric potential"
      },
      {
        "haystackUnit": "kilovolt_ampere_hour",
        "symbols": [
          "kVAh"
        ],
        "quantity": "apparent energy"
      },
      {
        "haystackUnit": "kilovolt_ampere_reactive_hour",
        "symbols": [
          "kVARh"
        ],
        "quantity": "reactive energy"
      },
      {
        "haystackUnit": "kilowatt_hours_per_cubic_meter",
        "symbols": [
          "kWh/m³"
        ],
        "quantity": "energy by volume"
      },
      {
        "haystackUnit": "kilowatt_hours_per_square_foot",
        "symbols": [
          "kWh/ft²"
        ],
        "quantity": "energy by area"
      },
      {
        "haystackUnit": "kilowatt_hours_per_square_meter",
        "symbols": [
          "kWh/m²"
        ],
        "quantity": "energy by area"
      },
      {
        "haystackUnit": "kilowatt_per_ton",
        "symbols": [
          "kW/ton"
        ],
        "quantity": "cooling efficiency"
      },
      {
        "haystackUnit": "kilowatts_per_gallons_per_minute",
        "symbols": [
          "kW/gal/min"
        ],
        "quantity": "power by volumetric flow"
      },
      {
        "haystackUnit": "kilowatts_per_kilocubic_feet_per_minute",
        "symbols": [
          "kW/kcfm"
        ],
        "quantity": "power by volumetric flow"
      },
      {
        "haystackUnit": "kilowatts_per_square_foot",
        "symbols": [
          "kW/ft²"
        ],
        "quantity": "power by area"
      },
      {
        "haystackUnit": "kilowatts_per_square_meter",
        "symbols": [
          "kW/m²"
        ],
        "quantity": "power by area"
      },
      {
        "haystackUnit": "kina",
        "symbols": [
          "PGK"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "kip",
        "symbols": [
          "LAK",
          "₭"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "knot",
        "symbols": [],
        "quantity": "velocity"
      },
      {
        "haystackUnit": "konvertibilna_marka",
        "symbols": [
          "BAM",
          "КМ"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "kuwaiti_dinar",
        "symbols": [
          "KWD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "kwacha",
        "symbols": [
          "MWK",
          "MK"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "kwanza",
        "symbols": [
          "AOA",
          "Kz"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "kyat",
        "symbols": [
          "MMK"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "lari",
        "symbols": [
          "GEL",
          "ლ"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "lebanese_pound",
        "symbols": [
          "LBP"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "lek",
        "symbols": [
          "ALL"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "lempira",
        "symbols": [
          "HNL"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "leone",
        "symbols": [
          "SLL",
          "Le"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "leu",
        "symbols": [
          "RON"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "liberian_dollar",
        "symbols": [
          "LRD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "libyan_dinar",
        "symbols": [
          "LYD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "lilangeni",
        "symbols": [
          "SZL"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "liters_per_hour",
        "symbols": [
          "L/h"
        ],
        "quantity": "volumetric flow"
      },
      {
        "haystackUnit": "liters_per_minute",
        "symbols": [
          "L/min"
        ],
        "quantity": "volumetric flow"
      },
      {
        "haystackUnit": "loti",
        "symbols": [
          "LSL"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "lumen",
        "symbols": [
          "lm"
        ],
        "quantity": "luminous flux"
      },
      {
        "haystackUnit": "malagasy_ariary",
        "symbols": [
          "MGA"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "malaysian_ringgit",
        "symbols": [
          "MYR",
          "RM"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "manat",
        "symbols": [
          "TMT"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "mauritius_rupee",
        "symbols": [
          "MUR"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "megabtu",
        "symbols": [
          "MBTU",
          "MMBTU"
        ],
        "quantity": "energy"
      },
      {
        "haystackUnit": "megabtu_per_square_foot",
        "symbols": [
          "MBTU/ft²"
        ],
        "quantity": "energy by area"
      },
      {
        "haystackUnit": "megabyte",
        "symbols": [
          "MB"
        ],
        "quantity": "bytes"
      },
      {
        "haystackUnit": "megahertz",
        "symbols": [
          "MHz"
        ],
        "quantity": "frequency"
      },
      {
        "haystackUnit": "megajoules_per_degree_kelvin",
        "symbols": [
          "MJ/°K"
        ],
        "quantity": "entropy"
      },
      {
        "haystackUnit": "megajoules_per_hour",
        "symbols": [
          "MJ/h"
        ],
        "quantity": "power"
      },
      {
        "haystackUnit": "megajoules_per_kilogram_dry_air",
        "symbols": [
          "MJ/kg_dry"
        ],
        "quantity": "enthalpy"
      },
      {
        "haystackUnit": "megajoules_per_square_foot",
        "symbols": [
          "MJ/ft²"
        ],
        "quantity": "energy by area"
      },
      {
        "haystackUnit": "megajoules_per_square_meter",
        "symbols": [
          "MJ/m²"
        ],
        "quantity": "energy by area"
      },
      {
        "haystackUnit": "megavolt",
        "symbols": [
          "MV"
        ],
        "quantity": "electric potential"
      },
      {
        "haystackUnit": "megavolt_ampere",
        "symbols": [
          "mVA"
        ],
        "quantity": "apparent power"
      },
      {
        "haystackUnit": "megavolt_ampere_hour",
        "symbols": [
          "MVAh"
        ],
        "quantity": "apparent energy"
      },
      {
        "haystackUnit": "megavolt_ampere_reactive",
        "symbols": [
          "MVAR"
        ],
        "quantity": "reactive power"
      },
      {
        "haystackUnit": "megavolt_ampere_reactive_hour",
        "symbols": [
          "MVARh"
        ],
        "quantity": "reactive energy"
      },
      {
        "haystackUnit": "megawatt_hours_per_square_foot",
        "symbols": [
          "MWh/ft²"
        ],
        "quantity": "energy by area"
      },
      {
        "haystackUnit": "megawatt_hours_per_square_meter",
        "symbols": [
          "MWh/m²"
        ],
        "quantity": "energy by area"
      },
      {
        "haystackUnit": "megohm",
        "symbols": [
          "MΩ",
          "MΩ"
        ],
        "quantity": "electric resistance"
      },
      {
        "haystackUnit": "meters_per_hour",
        "symbols": [
          "m/h"
        ],
        "quantity": "velocity"
      },
      {
        "haystackUnit": "meters_per_minute",
        "symbols": [
          "m/min"
        ],
        "quantity": "velocity"
      },
      {
        "haystackUnit": "meters_per_second_squared",
        "symbols": [
          "m/s²"
        ],
        "quantity": "acceleration"
      },
      {
        "haystackUnit": "metical",
        "symbols": [
          "MZN",
          "MTn"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "metric_ton",
        "symbols": [
          "ton"
        ],
        "quantity": "mass"
      },
      {
        "haystackUnit": "metric_tons_per_hour",
        "symbols": [
          "ton/h"
        ],
        "quantity": "mass flow"
      },
      {
        "haystackUnit": "mexican_peso",
        "symbols": [
          "MXN"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "micrometer",
        "symbols": [
          "µm"
        ],
        "quantity": "length"
      },
      {
        "haystackUnit": "microsecond",
        "symbols": [
          "µs"
        ],
        "quantity": "time"
      },
      {
        "haystackUnit": "mile",
        "symbols": [],
        "quantity": "length"
      },
      {
        "haystackUnit": "miles_per_hour",
        "symbols": [
          "mph"
        ],
        "quantity": "velocity"
      },
      {
        "haystackUnit": "milliampere",
        "symbols": [
          "mA"
        ],
        "quantity": "electric current"
      },
      {
        "haystackUnit": "millibar",
        "symbols": [
          "mbar"
        ],
        "quantity": "pressure"
      },
      {
        "haystackUnit": "milligram",
        "symbols": [
          "mg"
        ],
        "quantity": "mass"
      },
      {
        "haystackUnit": "milligrams_per_liter",
        "symbols": [
          "mg/L"
        ],
        "quantity": "density"
      },
      {
        "haystackUnit": "milliliter",
        "symbols": [
          "mL"
        ],
        "quantity": "volume"
      },
      {
        "haystackUnit": "milliliters_per_second",
        "symbols": [
          "mL/s"
        ],
        "quantity": "volumetric flow"
      },
      {
        "haystackUnit": "millimeters_of_mercury",
        "symbols": [
          "mmHg"
        ],
        "quantity": "pressure"
      },
      {
        "haystackUnit": "millimeters_per_hour",
        "symbols": [
          "mm/h"
        ],
        "quantity": "velocity"
      },
      {
        "haystackUnit": "millimeters_per_minute",
        "symbols": [
          "mm/min"
        ],
        "quantity": "velocity"
      },
      {
        "haystackUnit": "millimeters_per_second",
        "symbols": [
          "mm/s"
        ],
        "quantity": "velocity"
      },
      {
        "haystackUnit": "milliohm",
        "symbols": [
          "mΩ",
          "mΩ"
        ],
        "quantity": "electric resistance"
      },
      {
        "haystackUnit": "million_cubic_feet",
        "symbols": [
          "MMcf"
        ],
        "quantity": "volume"
      },
      {
        "haystackUnit": "million_cubic_feet_natural_gas",
        "symbols": [
          "MMcf_natural_gas"
        ],
        "quantity": "energy"
      },
      {
        "haystackUnit": "millivolt",
        "symbols": [
          "mV"
        ],
        "quantity": "electric potential"
      },
      {
        "haystackUnit": "milliwatt",
        "symbols": [
          "mW"
        ],
        "quantity": "power"
      },
      {
        "haystackUnit": "moldavian_leu",
        "symbols": [
          "MDL"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "moroccan_dirham",
        "symbols": [
          "MAD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "naira",
        "symbols": [
          "NGN",
          "₦"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "nakfa",
        "symbols": [
          "ERN",
          "Nfk"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "namibia_dollar",
        "symbols": [
          "NAD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "nanosecond",
        "symbols": [
          "ns"
        ],
        "quantity": "time"
      },
      {
        "haystackUnit": "nepalese_rupee",
        "symbols": [
          "NPR"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "nephelometric_turbidity_units",
        "symbols": [
          "ntu"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "new_israeli_shekel",
        "symbols": [
          "ILS",
          "₪"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "new_zealand_dollar",
        "symbols": [
          "NZD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "newton",
        "symbols": [
          "N"
        ],
        "quantity": "force"
      },
      {
        "haystackUnit": "newton_meter",
        "symbols": [
          "Nm"
        ],
        "quantity": "energy"
      },
      {
        "haystackUnit": "newton_second",
        "symbols": [
          "Ns"
        ],
        "quantity": "momentum"
      },
      {
        "haystackUnit": "newtons_per_meter",
        "symbols": [
          "N/m"
        ],
        "quantity": "surface tension"
      },
      {
        "haystackUnit": "ngultrum",
        "symbols": [
          "BTN"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "north_korean_won",
        "symbols": [
          "KPW"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "norwegian_krone",
        "symbols": [
          "NOK"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "nuevo_sol",
        "symbols": [
          "PEN"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "ohm_meter",
        "symbols": [
          "Ωm",
          "Ωm"
        ],
        "quantity": "electrical resistivity"
      },
      {
        "haystackUnit": "ouguiya",
        "symbols": [
          "MRO",
          "UM"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "ounce",
        "symbols": [
          "oz"
        ],
        "quantity": "mass"
      },
      {
        "haystackUnit": "pakistan_rupee",
        "symbols": [
          "PKR",
          "₨"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "pataca",
        "symbols": [
          "MOP"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "per_hour",
        "symbols": [
          "/h"
        ],
        "quantity": "frequency"
      },
      {
        "haystackUnit": "per_minute",
        "symbols": [
          "/min"
        ],
        "quantity": "frequency"
      },
      {
        "haystackUnit": "per_second",
        "symbols": [
          "/s"
        ],
        "quantity": "frequency"
      },
      {
        "haystackUnit": "percent_obscuration_per_foot",
        "symbols": [
          "%obsc/ft"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "percent_obscuration_per_meter",
        "symbols": [
          "%obsc/m"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "percent_per_second",
        "symbols": [
          "%/s"
        ],
        "quantity": "frequency"
      },
      {
        "haystackUnit": "peso_uruguayo",
        "symbols": [
          "UYU"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "petabyte",
        "symbols": [
          "PB"
        ],
        "quantity": "bytes"
      },
      {
        "haystackUnit": "ph",
        "symbols": [
          "pH"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "philippine_peso",
        "symbols": [
          "PHP",
          "₱"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "phot",
        "symbols": [],
        "quantity": "illuminance"
      },
      {
        "haystackUnit": "pint",
        "symbols": [
          "pt"
        ],
        "quantity": "volume"
      },
      {
        "haystackUnit": "pixel",
        "symbols": [
          "px"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "pound_force",
        "symbols": [
          "lbf"
        ],
        "quantity": "force"
      },
      {
        "haystackUnit": "pound_sterling",
        "symbols": [
          "GBP",
          "£"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "pounds_per_minute",
        "symbols": [
          "lb/min"
        ],
        "quantity": "mass flow"
      },
      {
        "haystackUnit": "pounds_per_second",
        "symbols": [
          "lb/s"
        ],
        "quantity": "mass flow"
      },
      {
        "haystackUnit": "power_usage_effectiveness",
        "symbols": [
          "PUE"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "psi_per_degree_fahrenheit",
        "symbols": [
          "psi/°F"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "pula",
        "symbols": [
          "BWP"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "pzloty",
        "symbols": [
          "PLN",
          "zł"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "qatari_rial",
        "symbols": [
          "QAR"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "quart",
        "symbols": [
          "qt"
        ],
        "quantity": "volume"
      },
      {
        "haystackUnit": "quetzal",
        "symbols": [
          "GTQ"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "radians_per_second",
        "symbols": [
          "rad/s"
        ],
        "quantity": "angular velocity"
      },
      {
        "haystackUnit": "radians_per_second_squared",
        "symbols": [
          "rad/s²"
        ],
        "quantity": "angular acceleration"
      },
      {
        "haystackUnit": "rand",
        "symbols": [
          "ZAR"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "rial_omani",
        "symbols": [
          "OMR"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "riel",
        "symbols": [
          "KHR"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "rufiyaa",
        "symbols": [
          "MVR"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "rupiah",
        "symbols": [
          "IDR",
          "Rp"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "russian_ruble",
        "symbols": [
          "RUB"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "rwanda_franc",
        "symbols": [
          "RWF"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "saint_helena_pound",
        "symbols": [
          "SHP"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "saudi_riyal",
        "symbols": [
          "SAR"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "serbian_dinar",
        "symbols": [
          "RSD",
          "din"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "seychelles_rupee",
        "symbols": [
          "SCR"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "short_ton",
        "symbols": [
          "t"
        ],
        "quantity": "mass"
      },
      {
        "haystackUnit": "siemens",
        "symbols": [
          "S"
        ],
        "quantity": "electric conductance"
      },
      {
        "haystackUnit": "siemens_per_meter",
        "symbols": [
          "S/m"
        ],
        "quantity": "electrical conductivity"
      },
      {
        "haystackUnit": "singapore_dollar",
        "symbols": [
          "SGD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "solomon_islands_dollar",
        "symbols": [
          "SBD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "som",
        "symbols": [
          "KGS"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "somali_shilling",
        "symbols": [
          "SOS"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "somoni",
        "symbols": [
          "TJS",
          "ЅМ"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "south_korean_won",
        "symbols": [
          "KRW",
          "₩"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "square_centimeter",
        "symbols": [
          "cm²"
        ],
        "quantity": "area"
      },
      {
        "haystackUnit": "square_inch",
        "symbols": [
          "in²"
        ],
        "quantity": "area"
      },
      {
        "haystackUnit": "square_kilometer",
        "symbols": [
          "km²"
        ],
        "quantity": "area"
      },
      {
        "haystackUnit": "square_meters_per_newton",
        "symbols": [
          "m²/N"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "square_mile",
        "symbols": [
          "mile²"
        ],
        "quantity": "area"
      },
      {
        "haystackUnit": "square_millimeter",
        "symbols": [
          "mm²"
        ],
        "quantity": "area"
      },
      {
        "haystackUnit": "square_yard",
        "symbols": [
          "yd²"
        ],
        "quantity": "area"
      },
      {
        "haystackUnit": "sri_lanka_rupee",
        "symbols": [
          "LKR",
          "Rs"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "steradian",
        "symbols": [
          "sr"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "sudanese_pound",
        "symbols": [
          "SDG"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "suriname_dollar",
        "symbols": [
          "SRD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "swedish_krona",
        "symbols": [
          "SEK"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "swiss_franc",
        "symbols": [
          "CHF",
          "SFr"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "syrian_pound",
        "symbols": [
          "SYP"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "taiwan_dollar",
        "symbols": [
          "TWD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "taka",
        "symbols": [
          "BDT",
          "৳"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "tala",
        "symbols": [
          "WST"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "tanzanian_shilling",
        "symbols": [
          "TZS"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "tenge",
        "symbols": [
          "KZT",
          "〒"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "tenths_second",
        "symbols": [
          "ds"
        ],
        "quantity": "time"
      },
      {
        "haystackUnit": "terabyte",
        "symbols": [
          "TB"
        ],
        "quantity": "bytes"
      },
      {
        "haystackUnit": "tesla",
        "symbols": [
          "T"
        ],
        "quantity": "magnetic flux density"
      },
      {
        "haystackUnit": "therms_per_hour",
        "symbols": [
          "therm/h"
        ],
        "quantity": "power"
      },
      {
        "haystackUnit": "thousand_cubic_feet",
        "symbols": [
          "Mcf"
        ],
        "quantity": "volume"
      },
      {
        "haystackUnit": "thousand_cubic_feet_natural_gas",
        "symbols": [
          "Mcf_natural_gas"
        ],
        "quantity": "energy"
      },
      {
        "haystackUnit": "trinidad_and_tobago_dollar",
        "symbols": [
          "TTD"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "tugrik",
        "symbols": [
          "MNT",
          "₮"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "tunisian_dinar",
        "symbols": [
          "TND"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "turkish_lira",
        "symbols": [
          "TRY",
          "₤"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "uae_dirham",
        "symbols": [
          "AED"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "uganda_shilling",
        "symbols": [
          "UGX"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "us_dollar",
        "symbols": [
          "USD",
          "$"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "uzbekistan_sum",
        "symbols": [
          "UZS"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "vatu",
        "symbols": [
          "VUV",
          "Vt"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "volt_ampere",
        "symbols": [
          "VA"
        ],
        "quantity": "apparent power"
      },
      {
        "haystackUnit": "volt_ampere_hour",
        "symbols": [
          "VAh"
        ],
        "quantity": "apparent energy"
      },
      {
        "haystackUnit": "volt_ampere_reactive",
        "symbols": [
          "VAR"
        ],
        "quantity": "reactive power"
      },
      {
        "haystackUnit": "volt_ampere_reactive_hour",
        "symbols": [
          "VARh"
        ],
        "quantity": "reactive energy"
      },
      {
        "haystackUnit": "volts_per_degree_kelvin",
        "symbols": [
          "V/K"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "volts_per_meter",
        "symbols": [
          "V/m"
        ],
        "quantity": "electric field strength"
      },
      {
        "haystackUnit": "watt_hours_per_square_foot",
        "symbols": [
          "Wh/ft²"
        ],
        "quantity": "energy by area"
      },
      {
        "haystackUnit": "watt_hours_per_square_meter",
        "symbols": [
          "Wh/m²"
        ],
        "quantity": "energy by area"
      },
      {
        "haystackUnit": "watts_per_cubic_feet_per_minute",
        "symbols": [
          "W/cfm"
        ],
        "quantity": "power by volumetric flow"
      },
      {
        "haystackUnit": "watts_per_cubic_meters_per_second",
        "symbols": [
          "W/m³/s"
        ],
        "quantity": "power by volumetric flow"
      },
      {
        "haystackUnit": "watts_per_meter_degree_kelvin",
        "symbols": [
          "W/m°K"
        ],
        "quantity": "thermal conductivity"
      },
      {
        "haystackUnit": "watts_per_square_foot",
        "symbols": [
          "W/ft²"
        ],
        "quantity": "power by area"
      },
      {
        "haystackUnit": "watts_per_square_foot_irradiance",
        "symbols": [
          "W/ft²_irr"
        ],
        "quantity": "irradiance"
      },
      {
        "haystackUnit": "watts_per_square_meter",
        "symbols": [
          "W/m²"
        ],
        "quantity": "power by area"
      },
      {
        "haystackUnit": "watts_per_square_meter_degree_kelvin",
        "symbols": [
          "W/m²K"
        ],
        "quantity": "dimensionless"
      },
      {
        "haystackUnit": "watts_per_square_meter_irradiance",
        "symbols": [
          "W/m²_irr"
        ],
        "quantity": "irradiance"
      },
      {
        "haystackUnit": "weber",
        "symbols": [
          "Wb"
        ],
        "quantity": "magnetic flux"
      },
      {
        "haystackUnit": "week",
        "symbols": [
          "wk"
        ],
        "quantity": "time"
      },
      {
        "haystackUnit": "yard",
        "symbols": [
          "yd"
        ],
        "quantity": "length"
      },
      {
        "haystackUnit": "yemeni_rial",
        "symbols": [
          "YER"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "yen",
        "symbols": [
          "JPY",
          "¥"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "zambian_kwacha",
        "symbols": [
          "ZMW",
          "ZK"
        ],
        "quantity": "currency"
      },
      {
        "haystackUnit": "zimbabwe_dollar",
        "symbols": [
          "ZWL"
        ],
        "quantity": "currency"
      }
    ],
    "haystackUnitsWithNoBusCodeByQuantity": {
      "acceleration": 1,
      "angular acceleration": 1,
      "angular momentum": 1,
      "angular velocity": 1,
      "apparent energy": 3,
      "apparent power": 2,
      "area": 7,
      "bytes": 6,
      "capacitance": 1,
      "cooling efficiency": 3,
      "currency": 149,
      "density": 4,
      "dimensionless": 19,
      "electric charge": 2,
      "electric conductance": 1,
      "electric current": 1,
      "electric current density": 1,
      "electric field strength": 1,
      "electric potential": 3,
      "electric resistance": 3,
      "electrical conductivity": 1,
      "electrical resistivity": 1,
      "electromagnetic moment": 1,
      "energy": 14,
      "energy by area": 12,
      "energy by volume": 3,
      "enthalpy": 9,
      "entropy": 3,
      "force": 2,
      "frequency": 9,
      "grammage": 2,
      "heating rate": 7,
      "illuminance": 1,
      "inductance": 1,
      "irradiance": 2,
      "length": 5,
      "luminance": 2,
      "luminous flux": 1,
      "luminous intensity": 1,
      "magnetic field strength": 1,
      "magnetic flux": 1,
      "magnetic flux density": 1,
      "mass": 6,
      "mass flow": 8,
      "momentum": 1,
      "power": 9,
      "power by area": 5,
      "power by volumetric flow": 4,
      "pressure": 6,
      "reactive energy": 3,
      "reactive power": 2,
      "specific entropy": 1,
      "surface tension": 1,
      "temperature differential": 1,
      "thermal conductivity": 1,
      "time": 6,
      "velocity": 12,
      "volume": 17,
      "volumetric flow": 10
    }
  },
  "protocolMap": {
    "rule": "The BUS protocol token registry, bus-protocols.json, was seeded from Haystack's protocol defs. This file does not restate it: an importer reads the haystackDef field there. TelemetryBinding.protocol MUST carry the registered token where one exists (7.5 openness applies to the rest).",
    "registry": "bus-protocols.json",
    "haystackProtocolDefs": [
      "bacnet",
      "bluetooth",
      "coap",
      "dali",
      "ftp",
      "haystack",
      "http",
      "imap",
      "knx",
      "modbus",
      "mqtt",
      "obix",
      "pop3",
      "smtp",
      "snmp",
      "sox",
      "zigbee",
      "zwave"
    ],
    "registeredFromHaystack": [
      "^bacnet",
      "^bluetooth",
      "^coap",
      "^dali",
      "^ftp",
      "^haystack",
      "^http",
      "^imap",
      "^knx",
      "^modbus",
      "^mqtt",
      "^obix",
      "^pop3",
      "^smtp",
      "^snmp",
      "^sox",
      "^zigbee",
      "^zwave"
    ],
    "haystackProtocolDefsNotInRegistry": []
  },
  "networkMap": {
    "rule": "Haystack ^network is a root entity type and bus:Network is new in v0.3, so the shapes correspond. bus:Network REQUIRES networkKind, which Haystack does not carry: an importer writes 'other' unless the protocol determines it, and MUST NOT infer 'fieldbus' from the presence of a device list.",
    "busNetworkKinds": [
      "fieldbus",
      "ip",
      "wireless",
      "serial",
      "virtual",
      "other"
    ],
    "sourceCarriesNetworkKind": false,
    "sourceCarriesSegment": false
  },
  "unmappable": [
    {
      "source": "children / childrenFlatten",
      "sourceKind": "prototype dicts",
      "count": 47,
      "reason": "Prototype structure — what an instance of this kind is expected to contain. BUS has no analogue and declined one for v0.3: it is a conformance-profiling mechanism, not an information model, and adopting it would make BUS assert that an AHU without a discharge temperature sensor is defective, which 5.3.3 forbids.",
      "busDisposition": "dropped; the loss is not declarable because BUS has no domain for it"
    },
    {
      "source": "^choice slots",
      "sourceKind": "choice",
      "count": 98,
      "reason": "A choice def declares a slot of mutually exclusive options. BUS has no slot mechanism: the option becomes a classification and the fact that it was drawn from an exclusive set is lost, so a receiver cannot tell that 'discharge' and 'return' are alternatives.",
      "busDisposition": "options survive as classifications; the exclusivity does not"
    },
    {
      "source": "conjunct subtyping semantics",
      "sourceKind": "conjunct",
      "count": 162,
      "reason": "Haystack states that conjuncts have no implied subtyping, so the tag set is authoritative and the conjunct symbol is a convenience. BUS classifications are unordered strings and carry no subtyping either, which means the crosswalk is lossless here only because both models are equally silent.",
      "busDisposition": "carried as classifications under classificationRule R2"
    },
    {
      "source": "op:* defs",
      "sourceKind": "feature",
      "count": 15,
      "reason": "REST operations on a Haystack server. Out of scope by 1.4: BUS records how a point is reached, not how to reach it.",
      "busDisposition": "dropped"
    },
    {
      "source": "filetype:* defs",
      "sourceKind": "feature",
      "count": 6,
      "reason": "Encodings a server can emit. BUS carries a media type on bus:Resource but has no vocabulary of source-model encodings.",
      "busDisposition": "dropped"
    },
    {
      "source": "lib:* defs",
      "sourceKind": "feature",
      "count": 4,
      "reason": "Library packaging. The library a def came from is recoverable from classification.version plus the Haystack registry; BUS has no field for it.",
      "busDisposition": "dropped"
    },
    {
      "source": "hisMode, hisInterpolate, hisTotalized",
      "sourceKind": "tag",
      "count": 3,
      "reason": "History semantics beyond {available, from, to}. Clause 8.8 carries the declaration that history exists and deliberately not its shape; the timeSeries domain is declared absent with reason deferredToLaterVersion (2.3).",
      "busDisposition": "properties against a declared PropertyDefinition (7.8), or declared absent"
    },
    {
      "source": "curVal, curStatus, curErr, writeVal, writeLevel",
      "sourceKind": "tag",
      "count": 5,
      "reason": "Live state. A BUS package describes a building, not its current values (5.2). The one exception, an active override, is a bus:Event, not a point field.",
      "busDisposition": "dropped"
    },
    {
      "source": "^syntheticModel cone and the ML tags",
      "sourceKind": "entity and tags",
      "count": 16,
      "reason": "What produced a value. Annex F.1 names analytic-rule portability as a known gap; Haystack's answer is partial and BUS declined to copy it (R11).",
      "busDisposition": "the produced point survives with pointKind 'derived'; the model does not"
    },
    {
      "source": "^evseSession",
      "sourceKind": "entity",
      "count": 1,
      "reason": "A charging transaction. Genuinely outside BUS's boundary (5.2): it is a record of commerce, not of the building.",
      "busDisposition": "dropped"
    },
    {
      "source": "reciprocal associations (contains, tags, quantities)",
      "sourceKind": "association",
      "count": 3,
      "reason": "computedFromReciprocal and never authored. Not a loss so much as a hazard: two exporters reading the same building through different interfaces see different models.",
      "busDisposition": "derived from the authored direction; the conformance claim states which interface was read"
    }
  ],
  "unmappableFromBus": [
    {
      "busConstruct": "bus:Objective, bus:Target, bus:Constraint",
      "reason": "Haystack has no term for what a building is meant to achieve, as distinct from a stored setpoint value. A setpoint is a point with the sp marker and nothing else."
    },
    {
      "busConstruct": "bus:Sequence and Sequence.deployment",
      "reason": "No sequence, program or control-logic construct exists in 4.0.0. The asDesigned/asDeployed distinction has nowhere to land."
    },
    {
      "busConstruct": "bus:AlarmDefinition",
      "reason": "Haystack has one marker, ^alarm. No limits, deadband, delays, severity, routing, acknowledgement or shelving policy."
    },
    {
      "busConstruct": "bus:Event",
      "reason": "No event construct. 'Someone overrode this in 2019 and never took it out' is inexpressible."
    },
    {
      "busConstruct": "bus:KnowledgeNote",
      "reason": "No construct for a note about an instance. doc describes a def, not an entity."
    },
    {
      "busConstruct": "Provenance on every assertion",
      "reason": "No provenance construct in the 719 defs. An import into BUS MUST therefore synthesize provenance with method 'imported' rather than omit it, because method is REQUIRED (14.1)."
    },
    {
      "busConstruct": "bus:Relationship as an entity",
      "reason": "A Haystack ref is a value in the subject's dict. There is no slot for the edge's id, provenance, validFor, qualifiers or ports. Exporting BUS relationships to Haystack MUST declare the relationships domain partial with reason notSupportedByExporter (16.6)."
    },
    {
      "busConstruct": "Clause 13 presentation model",
      "reason": "No drawing, layer, element, symbol role, geometry or binding of any kind."
    },
    {
      "busConstruct": "The completeness declaration",
      "reason": "Haystack has no package concept, so the question cannot be posed."
    },
    {
      "busConstruct": "bus:Party",
      "reason": "No person or organization model."
    }
  ],
  "counts": {
    "entityTypesMapped": 142,
    "entityTypesReachingNoBusType": 7,
    "entityTypesByFidelity": {
      "conditional": 15,
      "exact": 21,
      "narrowing": 1,
      "none": 10,
      "widening": 95
    },
    "predicatesMapped": 33,
    "predicatesReachingNoBusPredicate": 5,
    "predicatesWhereMediumIsNotSatisfiable": 2,
    "predicatesByFidelity": {
      "conditional": 13,
      "exact": 10,
      "none": 4,
      "widening": 6
    },
    "portsMapped": 28,
    "mediumsMapped": 14,
    "mediumsReachingOnlyOther": 1,
    "unitCodesMapped": 74,
    "busUnitCodesWithNoSourceUnit": 3,
    "sourceUnitsWithNoBusCode": 383,
    "unmappableConstructs": 11,
    "busConstructsSourceCannotExpress": 10
  }
}
