{
  "version": "0.2.0",
  "updatedAt": "2026-07-19",
  "rules": [
    {
      "id": "guardrail.map.provider_neutral_domain",
      "severity": "error",
      "summary": "Map domain contracts must not use Cesium, Ion, OSM, GOS or renderer graphics types as canonical business entities.",
      "entityIds": ["map.view", "map.renderer_adapter", "map.provider_capability"]
    },
    {
      "id": "guardrail.map.engine_does_not_own_visuals",
      "severity": "error",
      "summary": "ENGINE/NDC sources may publish spatial data and commands but must not own Map Page geometry, label design, pin design or renderer credentials.",
      "entityIds": ["map.view", "map.pin", "map.label", "map.style_profile", "future.interface_binding", "engine.workflow_l1"]
    },
    {
      "id": "guardrail.map.selection_targets_domain_subject",
      "severity": "error",
      "summary": "Selection and application commands must target stable domain subject identifiers, not transient renderer entity references.",
      "entityIds": ["map.selection", "map.renderer_adapter", "future.interface_binding"]
    },
    {
      "id": "guardrail.map.labels_use_shared_contract",
      "severity": "warning",
      "summary": "Transport, station, city and other labels must use the shared Map Label contract with semantic variants instead of source-specific label implementations.",
      "entityIds": ["map.label", "map.moving_object", "map.station", "map.stop", "map.terminal", "map.place_target"]
    },
    {
      "id": "guardrail.map.presentation_uses_normalized_state_facets",
      "severity": "error",
      "summary": "Foundry presentation classes, filters, counters and sorting must consume only state facets and exact values declared by the bound Data Product and Ontology value contract. Renderer and profile code must not classify raw values or add fallback states.",
      "entityIds": ["map.moving_object", "map.state_facet", "map.style_profile", "map.renderer_adapter"]
    },
    {
      "id": "guardrail.map.mass_geometry_requires_strategy",
      "severity": "warning",
      "summary": "Large zone and track collections require explicit batching, tiling, visibility and update strategy before production renderer acceptance.",
      "entityIds": ["map.zone", "map.track_segment", "map.visibility_rule", "map.renderer_adapter"]
    },
    {
      "id": "guardrail.map.ontology_does_not_store_runtime_snapshots",
      "severity": "error",
      "summary": "Ontology Core describes map meanings and contracts; it must not store live vehicle positions, provider tokens, full geozone snapshots or railway GeoJSON datasets.",
      "entityIds": ["map.moving_object", "map.zone", "map.track_segment", "map.provider_capability"]
    }
  ],
  "blockedConflations": [
    ["map.view", "map.renderer_adapter"],
    ["map.moving_object", "map.pin"],
    ["map.state_facet", "map.style_profile"],
    ["map.station", "map.label"],
    ["map.route", "map.track_segment"],
    ["map.visibility_rule", "map.provider_capability"],
    ["map.selection", "map.renderer_adapter"]
  ]
}
