Multivendor Agentic RCA for Cloud RAN

An on-demand 5G RAN and core sandbox on OpenShift, a live PTP timing-fault injection, and a governed agent that finds the root cause by collecting evidence from every vendor's layer.

For Red Hat solution architects. Source: github.com/dkypuros/multivendor-agentic-rca

1The problem

A cell goes down. In a multivendor RAN that one symptom can come from:

Each vendor's tools see only their own layer. The NOC sees "cell unavailable".

2The idea

NEP agent (RCA orchestrator) CAPIF (scoped token) MCP gateway (checks scope, routes) O-Cloud plane(Red Hat ACM) RAN plane(O-DU over O1) Timing plane(Red Hat PTP) NIC plane(Intel E810, emulated) 1. get token 2. MCP + token 3. MCP tool calls → 4. a fixed policy decides; an LLM only explains NEP agent code CAPIF code MCP gateway code O-Cloud plane code RAN plane code Timing plane code NIC plane code (emulated)

Click any box to open its code on GitHub.

3Demo flow

ClickWhat you seeCode
Start RAN SlicePod scales 0→1, 32 NFs boot, cell ACTIVE, UE registers (5G-AKA), 3/3 GTP-U echoeslaunch_slice.py, ue_sim.py
Inject FaultPTP FREERUN (−50 ms), cell locked over O1, O-DU alarm lossOfRealTimeSynchronizationptp_bridge.py
Run RCACAPIF token, 4 MCP tool calls, OC-TimingDegraded, 2/3 → HOLD, TMF688 eventnep_orchestrator.py
Heal TimingPTP LOCKED, cell ACTIVE, alarm clearedsandbox_controller.py
Run RCA again0/3 → NO ACTION: the verdict follows the evidenceexample run
Stop RAN SlicePod scales 1→0, CPU and memory releasedran-slice.yaml

Full presenter script with talk tracks: demo walkthrough (about 20 minutes).

4Block diagram

OpenShift project multivendor-rca (NetworkPolicy: same namespace only, Route to console) BrowserSA / presenter ran-sandbox-controllerweb console, drives the demo Route ran-slice (0 or 1 pod)32 NFs: 5G core, IMS,O-CU-CP/UP, O-DU, O-RU, UE scale 0↔1, O1 lock/unlock ptp-bridgesoftware PTP model inject / heal nep-orchestratorRCA agent + policy run RCA capifscoped token LLM (optional)narrates only mcp-gatewayscope → tool routing tools/call mcp-ocloud mcp-ran mcp-redhat (PTP) mcp-intel (NIC) ocloud: ACM, else "unavailable" ran: reads O-DU O1 on ran-slice redhat: reads ptp-bridge intel: EMULATED, never counted Console code RAN slice launcher ptp-bridge code NEP agent code CAPIF code Connect an LLM Gateway policy (scopes) O-Cloud plane code RAN plane code PTP plane code NIC plane code

Click any box to open its code on GitHub. Manifests: deploy/openshift.

  • Dashed frame: one OpenShift project. A NetworkPolicy lets pods talk only to each other; the Route to the console is the only way in.
  • Left column, top to bottom: the presenter's browser, the console that drives the demo, and the RAN slice it scales between 0 and 1 pods.
  • Middle: the console injects and heals timing faults on ptp-bridge, and asks the NEP agent to run an RCA.
  • Right: the agent's path: token from CAPIF, tool calls through the gateway, one MCP server per plane, and an optional LLM for the narrative.

5Sequence (high level)

Console ran-slice ptp-bridge NEP agent CAPIF MCP planes Start: scale 0→1 cell ACTIVE, UE attach, 3/3 echoes Inject: FREERUN, −50 ms O1 lock cell → O-DU alarm Run RCA token (scoped) 4 tools/call via gateway route table decides; LLM narrates OC-TimingDegraded, 2/3 → HOLD (TMF688) Heal: LOCKED, 0 ns O1 unlock → cell ACTIVE Run RCA again no fault, 0/3 → NO ACTION Stop: scale 1→0, resources released
  • Columns are components; time runs downward. Each arrow is a call, labeled with what it does or returns.
  • Four phases: Start (a UE attaches), Inject (timing breaks, the cell is locked), RCA (token, tool calls, verdict), then Heal, re-check and Stop.
  • Compare the two RCA results: 2/3 → HOLD during the fault and 0/3 → NO ACTION after heal. The verdict follows the evidence.

Full call-by-call version: sequence-detailed.pdf

6Components and fidelity

Component (code)RoleHow real
ran-slice5G core + O-RAN split RAN, 32 NFs in one podReal protocol logic in Python; no PHY/RF
ue_simUE attach, PDU session, GTP-U echoReal MILENAGE 5G-AKA and NAS flow
ptp-bridgePTP state and CloudEvents, fault injectionSoftware model of ptp4l
O-DU alarmTS 28.532 alarm over O1Raised by the O-DU, after the console's protective lock
capifTS 29.222 onboarding and scoped tokenReal flow; unsigned lab tokens
mcp-gatewayScope check, routes tool calls to planesReal; not a security boundary
NIC planeIntel E810 timestamp countersEmulated, never counted
O-Cloud planeACM ManagedCluster healthReal only with ACM; else "unavailable" (how)
nep-orchestratorEvidence, policy, TMF688 eventDeterministic decision; LLM optional (how)

Terms: glossary · concept pages. More: architecture · APIs, config and ports · deployment · security notes

7How the decision is made

8Try it

You need an OpenShift 4.x cluster, oc logged in, and git. Repo: github.com/dkypuros/multivendor-agentic-rca

1. Get the code

git clone https://github.com/dkypuros/multivendor-agentic-rca.git
cd multivendor-agentic-rca

2. Deploy (run from the repo folder)

oc new-project multivendor-rca
oc apply -k deploy/openshift                   # Deployments, Services, RBAC, NetworkPolicies, Route, BuildConfig
oc start-build mvrca --from-dir=. --follow     # builds the image from your local clone
oc rollout restart deployment -l app.kubernetes.io/part-of=multivendor-rca

3. Open the console and check it

oc get route ran-sandbox -o jsonpath='https://{.spec.host}{"\n"}'
python3 tests/smoke_route.py https://$(oc get route ran-sandbox -o jsonpath='{.spec.host}')   # ALL GREEN

Then follow the 20-minute demo walkthrough. Details and troubleshooting: deployment guide.

No cluster?

pip install pyyaml
python3 tests/e2e_local.py                     # runs Start / Inject / RCA / Heal / Stop on a laptop

Lab only: the console has no login. Share its URL deliberately.

9Reference: the lab

The single-node OpenShift cluster these demos run on, as inventoried on 29 Sep 2026. For reference only; the demo itself needs far less.

Hardware (one server)

CPU2 × Intel Xeon 6767P (Granite Rapids), 256 threads
CPU featuresIntel AMX (INT8, BF16, FP16, FP8), SGX, TDX
AcceleratorsIntel QAT 402xx (8 endpoints), Intel DLB 2.5 (8 devices)
Memoryabout 512 GB
Local diskabout 1.9 TB
NetworkBroadcom NetXtreme-E, dual port. No Intel E810, which is why the NIC plane is emulated
GPUNone: LLM inference runs on CPU with AMX

Platform

OpenShift4.22.1, single node
OSRHEL CoreOS 9.8, kernel 5.14.0-687
RuntimeCRI-O 1.35
StorageNFS (default class), MinIO S3
Demo imageUBI 9 Python 3.12

Used by this demo

OpenShift4.22.1: runs every component (Deployments, Route, NetworkPolicy, builds)
Red Hat OpenShift AI3.4.0: Llama 3.1 8B Instruct (w8a8) on vLLM for CPU. Optional LLM narrator, off by default

Timing comes from the demo's own software PTP model, not the PTP Operator. See the glossary.

On the lab cluster (not used by the demo)

PTP Operator 4.22 · O-Cloud Manager 4.22.1 · Topology Aware Lifecycle Manager 4.22.1 · Node Feature Discovery 4.22 · Intel Device Plugins 0.36 · Argo CD 0.18 · Advanced Cluster Security 4.11 · Service Mesh 3.4 · Serverless 1.37 · Pipelines 1.23 · Connectivity Link 1.4 · build of Keycloak 26.4 · Quay 3.14 · Streams for Apache Kafka 3.2 · Logging 6.6 + Loki · Tempo 0.22 · build of OpenTelemetry 0.158 · Cluster Observability 1.5 · cert-manager 1.19 · sandboxed containers 1.13 · build of Trustee 1.2 · Intel TDX DCAP 0.1 · Kernel Module Management 2.6

10Reference: Red Hat and Intel, better together for RCA

Queryalarm + evidenceEmbedtext → vectorsRetrieverunbooks, KBsRerankbest passages firstLLM inferencevLLM, Llama 3.1 8BResponseexplained RCAin this demonot in this demo (next step)in this demo (optional)Red Hat OpenShift AIKServe model serving · vLLM runtime for CPU · pipelines · one platform with the RANIntel Xeon 6 with AMXINT8/BF16 matrix math in the CPU · no GPU for embedding, rerank, small LLMssoftwaresilicon
  • Top row, left to right: the steps of an AI assistant that answers "why did this cell go down?". The query is the alarm plus the evidence the agent collected.
  • Solid boxes are in this demo: the evidence query, optional LLM narration (Llama 3.1 8B on vLLM, running on the lab's Xeon 6 CPUs), and the response. Dashed boxes are the natural next step: embed, retrieve and rerank runbooks and vendor knowledge bases to ground the answer.
  • Bottom bands: every step runs on the same stack. Red Hat OpenShift AI serves the models on the same OpenShift that runs the RAN; Intel Xeon 6 AMX runs the matrix math on the CPU.
  • Why it matters at the edge: cell sites and regional data centers rarely have GPUs. Running retrieval and a small LLM on Xeon keeps the assistant next to the network it explains.
  • Still true: the decision stays with the deterministic policy. Retrieval and the LLM improve the explanation, not the verdict.

See the lab's hardware on the previous slide. Related: mcp-multivendor-tutorial (vendor knowledge agents over MCP) · connect an LLM