{
  "busVersion": "0.3",
  "title": "BUS predicate registry",
  "status": "Normative as to the token set and meanings; ADVISORY as to cardinality.",
  "rationale": "Through v0.3 the predicate vocabulary lived in two places: as an enum in bus-core.schema.json and as a hand-typed table in clause 9.2 — the pattern this project's own history says will drift. This registry is now the single source: the clause renders from it and the build fails if it disagrees with the schema enum. It also carries what neither place could: cardinality. Every ontology-shaped consumer — a property graph, an object store, an RDF triple store — must declare link cardinality, and a vocabulary that stays silent forces every one of them to guess, differently.",
  "cardinalityGrading": "ADVISORY, deliberately. The hint describes the ordinary shape of the relationship, subject to object, so a consumer knows what index to build and what to flag as unusual. A package exceeding a hint is NOT invalid and MUST NOT be refused: the building is the authority on its own topology, and the notes below record exactly the cases — dual feeds, check meters, consolidations — where the ordinary shape is not the true one.",
  "direction": "Cardinality reads subject-to-object for the forward predicate. The inverse's cardinality is the mirror (one-to-many becomes many-to-one) and is derived, never stored — a stored mirror is a copy that can drift.",
  "pairs": [
    {
      "predicate": "bus:contains",
      "inverse": "bus:containedIn",
      "cardinality": "many-to-many",
      "meaning": "Spatial or organizational containment. Transitive.",
      "cardinalityNote": "Deliberately many-to-many: 8.4 permits a space to be contained by more than one thing, the usual case for a space on a storey and in a fire compartment."
    },
    {
      "predicate": "bus:hasPart",
      "inverse": "bus:partOf",
      "cardinality": "one-to-many",
      "meaning": "Compositional part of an asset. Transitive. Equipment to component.",
      "cardinalityNote": "A part belongs to one whole at a time; succession over time is carried by validity intervals, not by multiple wholes."
    },
    {
      "predicate": "bus:hasMember",
      "inverse": "bus:memberOf",
      "cardinality": "many-to-many",
      "meaning": "Grouping without containment. Not transitive. System to equipment, zone to space."
    },
    {
      "predicate": "bus:locatedIn",
      "inverse": "bus:hasLocation",
      "cardinality": "many-to-one",
      "meaning": "Physical placement of an asset in a space.",
      "cardinalityNote": "An asset is in one space at a time; a move is a new relationship with a new validity interval, not a second location."
    },
    {
      "predicate": "bus:serves",
      "inverse": "bus:servedBy",
      "cardinality": "many-to-many",
      "meaning": "Delivery of a service to a space, zone, or asset."
    },
    {
      "predicate": "bus:feeds",
      "inverse": "bus:fedBy",
      "cardinality": "many-to-many",
      "meaning": "Directed flow of a medium. Requires `medium`."
    },
    {
      "predicate": "bus:connectedTo",
      "inverse": "self",
      "cardinality": "many-to-many",
      "meaning": "Undirected physical connection, qualified by medium and port."
    },
    {
      "predicate": "bus:powers",
      "inverse": "bus:poweredBy",
      "cardinality": "many-to-many",
      "meaning": "Electrical supply. What an operator traces during an outage.",
      "cardinalityNote": "Commonly many-to-one in practice, but dual feeds through a transfer switch are real and expected; a consumer that indexes this as single-parent will mis-model exactly the buildings where the power topology matters most."
    },
    {
      "predicate": "bus:measures",
      "inverse": "bus:measuredBy",
      "cardinality": "many-to-one",
      "meaning": "Observation. Point to the thing observed.",
      "cardinalityNote": "A point observes one thing; many points may observe it."
    },
    {
      "predicate": "bus:commands",
      "inverse": "bus:commandedBy",
      "cardinality": "many-to-one",
      "meaning": "Actuation by a point. Point to the thing acted upon."
    },
    {
      "predicate": "bus:controls",
      "inverse": "bus:controlledBy",
      "cardinality": "many-to-many",
      "meaning": "Governance by a controller, sequence, or strategy.",
      "cardinalityNote": "Lead/lag pairs and supervisory overrides make single-controller assumptions wrong often enough to forbid them here."
    },
    {
      "predicate": "bus:hosts",
      "inverse": "bus:hostedBy",
      "cardinality": "one-to-many",
      "meaning": "Provision of an addressable home for a point. Device to point.",
      "cardinalityNote": "A point has one addressable home."
    },
    {
      "predicate": "bus:appliesTo",
      "inverse": "bus:hasApplicable",
      "cardinality": "many-to-many",
      "meaning": "Attachment of intent, an alarm definition, or a result to what it concerns."
    },
    {
      "predicate": "bus:implements",
      "inverse": "bus:implementedBy",
      "cardinality": "many-to-many",
      "meaning": "A sequence or schedule realizes an intent."
    },
    {
      "predicate": "bus:explains",
      "inverse": "bus:explainedBy",
      "cardinality": "many-to-many",
      "meaning": "Knowledge accounts for why something is as it is."
    },
    {
      "predicate": "bus:supports",
      "inverse": "bus:supportedBy",
      "cardinality": "many-to-many",
      "meaning": "Knowledge or evidence supports an assertion."
    },
    {
      "predicate": "bus:justifies",
      "inverse": "bus:justifiedBy",
      "cardinality": "many-to-many",
      "meaning": "A rationale justifies a decision or change."
    },
    {
      "predicate": "bus:derivedFrom",
      "inverse": "bus:derives",
      "cardinality": "many-to-many",
      "meaning": "Dependence of a calculated value on its inputs."
    },
    {
      "predicate": "bus:documentedBy",
      "inverse": "bus:documents",
      "cardinality": "many-to-many",
      "meaning": "Attachment of a resource to what it describes."
    },
    {
      "predicate": "bus:represents",
      "inverse": "bus:representedBy",
      "cardinality": "many-to-one",
      "meaning": "A drawing or element depicts a building entity.",
      "cardinalityNote": "An element depicts one entity; an entity may be depicted on many drawings."
    },
    {
      "predicate": "bus:replaces",
      "inverse": "bus:replacedBy",
      "cardinality": "one-to-one",
      "meaning": "Lifecycle succession.",
      "cardinalityNote": "The common case is a chain. Consolidations and splits — one asset replacing two, or two replacing one — are legal and are expressed as multiple relationships; this hint describes the ordinary case, not a constraint."
    },
    {
      "predicate": "bus:hasSubMeter",
      "inverse": "bus:subMeterOf",
      "cardinality": "one-to-many",
      "meaning": "Metering subdivision. The object meters a share of what the subject meters. New in v0.3; energy allocation was inexpressible without it.",
      "cardinalityNote": "A metering tree in the ordinary case; a check meter observing two parents is legal."
    },
    {
      "predicate": "bus:references",
      "inverse": null,
      "cardinality": "many-to-many",
      "meaning": "A link that is real but whose nature is not modeled. Deliberately weak."
    }
  ]
}
