{
  "_comment": [
    "Declared ICD-to-VSI gateway mapping. This file exists because Teamcenter does",
    "NOT record an interface protocol today (measured 2026-08-20, see README).",
    "Every rule here is a DERIVED assumption, not TC data. It is deliberately a",
    "reviewable file rather than logic buried in code, so a wrong call is visible.",
    "",
    "Resolution order in icd_to_vsi.py:",
    "  1. Seg0Implements on the port (uid-based, authoritative)  <- preferred",
    "  2. these rules, matched on the Seg0Interface name          <- fallback, WARNS",
    "  3. unresolved                                              <- listed, never dropped silently",
    "",
    "interface_class values are the ten from IRL_AUDIT_RUBRIC.md section 2.",
    "Casing is load-bearing: a producer emitting 'dataBus' against a vocabulary",
    "keyed 'databus' had half its ICD grade CANNOT_TELL. icd_to_vsi.py asserts",
    "the vocabulary before it runs rather than treating an unknown class as absent."
  ],
  "interface_classes": [
    "fluid",
    "electrical-power",
    "electrical-signal",
    "databus",
    "RF",
    "optical",
    "software-api",
    "mechanical",
    "thermal",
    "human"
  ],
  "vsi_protocols": [
    "Ethernet",
    "Can",
    "Lin",
    "Spi",
    "Uart",
    "Pwm",
    "Gpio",
    "Axi",
    "GenericPayload"
  ],
  "class_carries_protocol": {
    "databus": true,
    "electrical-signal": true,
    "software-api": true,
    "optical": true,
    "RF": false,
    "electrical-power": false,
    "fluid": false,
    "mechanical": false,
    "thermal": false,
    "human": false
  },
  "exclusion_reasons": {
    "RF": "An RF link carries no VSI transaction of its own; the data riding it belongs to the bus at each end. Model the endpoints, not the link.",
    "electrical-power": "Power rails carry no protocol. VSI has no power gateway.",
    "fluid": "Fluid transfer. No VSI gateway exists for it.",
    "mechanical": "Mechanical mount, linkage or bond. Carries load, not data.",
    "thermal": "Thermal path. Carries heat, not data.",
    "human": "Reaches a person directly. The far end is not a simulatable VSI client."
  },
  "rules": [
    {
      "match": "(?i)platformtimereference$",
      "class": "electrical-signal",
      "protocol": "Gpio",
      "why": "MSP2 2026-09-06: 1PPS, IRIG-B and REFCLK are timing signals; Gpio rides GenericPayload between C++ components (DECLARED, Teamcenter records no protocol)"
    },
    {
      "match": "(?i)safetychain$",
      "class": "databus",
      "protocol": "Uart",
      "why": "MSP2 2026-09-06: SAFETY_BUS is a safety-related serial bus with inhibit and alive discretes beside it; Uart rides GenericPayload (DECLARED)"
    },
    {
      "match": "(?i)discretes$",
      "class": "electrical-signal",
      "protocol": "Gpio",
      "why": "MSP2 2026-09-06: card presence, health and BIT discretes plus the slot id; plural of the existing discrete$ rule (DECLARED)"
    },
    {
      "match": "(?i)axi_if$",
      "class": "databus",
      "protocol": "Axi",
      "why": "MSP2 2026-09-06: the model's on-chiplet AXI interface block; it carries no signals and no ports here, so it is reported, not wired (DECLARED)"
    },
    {
      "match": "(?i)ethernet$",
      "class": "databus",
      "protocol": "Ethernet",
      "why": "named Ethernet"
    },
    {
      "match": "(?i)bus$",
      "class": "databus",
      "protocol": "Can",
      "why": "named as a control bus; CAN is the VSI stand-in for a vehicle control bus"
    },
    {
      "match": "(?i)(serial|uart)$",
      "class": "databus",
      "protocol": "Uart",
      "why": "named serial"
    },
    {
      "match": "(?i)discrete$",
      "class": "electrical-signal",
      "protocol": "Gpio",
      "why": "discrete signal maps to a GPIO line"
    },
    {
      "match": "(?i)^timereference$",
      "class": "electrical-signal",
      "protocol": "Gpio",
      "why": "time reference distributed as a discrete pulse"
    },
    {
      "match": "(?i)(service|gateway|api)$",
      "class": "software-api",
      "protocol": "Ethernet",
      "why": "software API over TCP/IP"
    },
    {
      "match": "(?i)(backhaul|c2link|c2$|satcomlink)",
      "class": "databus",
      "protocol": "Ethernet",
      "why": "IP backhaul or C2 data link"
    },
    {
      "match": "(?i)fiberlink$",
      "class": "optical",
      "protocol": "Ethernet",
      "why": "fibre carrying data; VSI sees the Ethernet above it"
    },
    {
      "match": "(?i)(camera)?control$",
      "class": "databus",
      "protocol": "Uart",
      "why": "serial control channel"
    },
    {
      "match": "(?i)(interface|link)$",
      "class": "databus",
      "protocol": "Ethernet",
      "why": "generic data interface; WEAK match, review this one"
    },
    {
      "match": "(?i)(rail|power|vdc)$",
      "class": "electrical-power",
      "protocol": null,
      "why": "power rail"
    },
    {
      "match": "(?i)(coldplate|coolant|coldfinger)",
      "class": "thermal",
      "protocol": null,
      "why": "thermal path"
    },
    {
      "match": "(?i)(mount|attachment|linkage|bond)$",
      "class": "mechanical",
      "protocol": null,
      "why": "structural"
    },
    {
      "match": "(?i)(supply)$",
      "class": "fluid",
      "protocol": null,
      "why": "fluid supply"
    },
    {
      "match": "(?i)(console)$",
      "class": "human",
      "protocol": null,
      "why": "human-facing surface"
    },
    {
      "match": "(?i)(rf$|radio$|transceiver$|antennafeed$|opticalwindow$)",
      "class": "RF",
      "protocol": null,
      "why": "RF or aperture"
    }
  ]
}