Skip to content
const portfolio = { loading: true, status: 'initializing...'};
0%

case study· Microsoft Security · self-initiated

R.E.N.A.N

Risk Evaluation Neural Agent Network

Thousands of AI agents. Every risk they share. One living graph — that talks back.

I turned a flat inventory of 26,570 AI agents into a single interactive graph you can see, question, and operate by voice.

Solo design + build4 days · 8 iterations
Live demoSee the build Password-protected
v7 · live
R.E.N.A.N — a dark violet HUD graph of AI-agent identities clustered around glowing purple risk-indicator hubs, with the RIOS arc-reactor at the centre of a bottom command dock.
scroll to feel the problem
0

AI agents in a single Defender inventory

There are 26,570 AI agents in one inventory. Each is a new identity with its own risk posture. That's the problem.

the problem

Every agent is a new identity — and its risk is scattered everywhere.

Organisations are spinning up thousands of AI agents — copilots, Copilot Studio agents, custom bots. Each one is a new identity with its own risk posture, and the signals about that risk live across four separate Microsoft security products.

As a flat table, the inventory hides the structure. You can't answer the basic questions: which agents are risky, and why? Which risks are systemic — shared across hundreds of agents? And how did we get here over time?

signals scattered across four products

Defender10 Entra8 Purview7 Intune3
A dense graph of hundreds of agent nodes wired to risk hubs — visually overwhelming, standing in for the scattered, hard-to-read state of the raw inventory.
The raw signal: hundreds of agents, dozens of risks, four products, no single view.

the insight

Risk isn't per-agent. It's shared. So I stopped using a table and drew a graph.

The same handful of risks recur across hundreds of agents. So I made each risk indicator a hub and let agents cluster around the indicators they exhibit. The systemic risks become the biggest, most central nodes automatically; an agent's risk profile is just its spokes.

One graph answers both questions at once — how exposed is this agent, and how widespread is this risk — with no per-product silos.

Risk is shared — so model it as a graph.
the thesis the whole project turns on
The first build: agents clustered around cyan risk-indicator hubs on a dark violet canvas.
v1 — the whole idea on screen at once: a custom canvas force graph.
One risk indicator selected, highlighting every agent that exhibits it.
Click a risk → every agent that has it. Selection is symmetric.

the journey

Eight iterations in four days.

It starts with what security teams work with today — a flat table. Over four days and eight iterations, it became R.E.N.A.N. The graphic on the right tracks the build.

today
Microsoft Defender's AI-agents inventory shown as a flat table — thousands of agent rows, most tagged Low risk, with columns for platform, publish status and risk indicators.
Today — the agent inventory as one long, flat table.
the status quo · in production

How it looks today

The status quo → thousands of agents in one flat list.

This is what security teams work with today: Microsoft Defender lists AI agents as a flat inventory — thousands of rows, one per agent, almost all tagged “Low”. You can sort and filter, but you can't see which risks are systemic, which agents share them, or how any of it connects. The signal is there; the shape of the problem isn't.

detail
A single agent's detail flyout in Defender, listing version, publish status, channels and risk level.
v1
First graph: agents around cyan indicator hubs.
v1 — custom canvas physics, cyan hubs, a command terminal.
git checkout v1

A working graph

An idea → a custom 2D canvas force simulation.

It started the day before, in a conversation with a partner on the security team who walked me through a new Defender view where AI agents appear as risk-bearing assets. I pulled the inventory that night; the next morning the first real build put the whole idea on screen — a hand-rolled velocity-Verlet force simulation rendering agents around cyan risk hubs, a dark violet HUD aesthetic, symmetric selection (click an agent → its risks; click a risk → its agents), and a “/” command terminal. Rolling the physics by hand, instead of a graph library, is what made every later visual choice possible.

detail
A selected agent's risk profile panel.
v2
28 purple indicators with a Sources filter panel.
v2 — real data, 28 indicators across Defender/Entra/Purview/Intune.
git checkout v2

Make it real

Synthetic sample → ~450 real agents, OCR'd from Defender.

I swapped the synthetic data for ~450 real agents transcribed from Defender AI Agents (preview) inventory screenshots via an OCR + hand-verification pipeline, and expanded the taxonomy to 28 indicators across four Microsoft sources. Real agent names and models made the demo credible — reviewers saw actual copilots and their actual detections, not lorem-ipsum risk.

detail
Source-grouped indicators in the detail panel.
v3
Indicators pinned on an outer ring encircling the agent cluster.
v3 — the ring layout that fixed the hairball.
git checkout v3

Tame the hairball

Free-floating cluster → indicators pinned on an outer ring.

With 450 agents and 28 hubs, a free layout became a hairball. Pinning every indicator on an evenly-spaced outer ring around the agent cluster — and retuning the force constants — made the hub-and-spoke structure legible again.

v4
R.E.N.A.N branding with the bottom timeline bar.
v4 — R.E.N.A.N branding + the timeline replay.
git checkout v4

Identity + time

A static snapshot → branding, a timeline replay, and a deploy.

The product became R.E.N.A.N with a network-node glyph. Two big interactions landed: a timeline that replays how agents appeared and how their risk climbed over their lifespan, and a multi-select intersection filter (shift-click several indicators → agents that have all of them). It was static-exported and deployed to Netlify behind HTTP Basic Auth.

detail
Timeline scrubber with a date range and live High/Medium/Low risk counts.
v5
The full-screen arc-reactor HUD in a LISTENING state with a boot greeting.
v5 — RIOS, the arc-reactor voice assistant.
git checkout v5

Give it a voice

A graph you read → a graph you talk to.

The most distinctive iteration: RIOS — Risk Intelligence Orchestration Sentinel — a JARVIS-styled voice assistant. The design principle was grounded-first: an always-on local engine answers from the live graph and returns the exact node ids it used; an optional LLM only rephrases those facts and can never invent numbers. RIOS doesn't just chat — it operates the interface by voice and flies the camera to the nodes it cites.

detail
The compact RiosCard entry point in the right column.
v6
Live-event toasts, monitoring controls, and a streaming activity feed.
v6 — the graph behaves like a real security console.
git checkout v6

Make it live

A still graph → a running SOC console.

A live-event system turned the graph into a running SOC: 8 event kinds generated from the real data, surfaced as toasts, a collapsible activity feed, on-graph node pulses, and camera fly-ins on critical alerts — with a Monitoring toggle, a Simulate button, and opt-in spoken RIOS announcements. Clicking any event flies to and selects the node.

detail
A selected agent's full indicator breakdown while the activity feed streams.
v7
The current state: RIOS at the centre of a bottom command dock.
v7 — RIOS at the centre of the command dock (current).
git checkout v7

RIOS becomes the hub

A side card → the centre of a full-width command dock.

The final refactor promoted RIOS from a side card to the centre of a full-width command dock: the arc-reactor protrudes from the middle of a bottom bar (a FAB-notch cradle), flanked by Timeline and Activity popovers, running the full HUD animation with a voice equalizer. Under the hood, the event engine was unified into a single useLiveEvents hook feeding both the feed and the graph toasts.

detail
The RIOS reactor as the dock hub.

meet RIOS

Then I gave it a voice — and rules it can't break.

RIOS doesn't just chat, it operates the graph by voice: “filter by Entra,” “open the Zava agent,” “play the timeline.” Cited nodes get a camera fly-to and a RIOS-cyan highlight.

The core principle is grounded-first. A deterministic local engine answers from the live graph and returns the exact node ids it used; an optional, provider-agnostic LLM only rephrases those grounded facts. It can phrase things warmly — but it can never invent an agent or a number. With no API key, the app runs fully offline on the local engine.

voice commands map to real actions

show the riskiest agents filter by Entra open the Zava agent play the timeline explain Active Threat
The LISTENING arc-reactor HUD reacting to the live audio waveform.
The reactor reacts to the live waveform — LISTENING, PROCESSING, SPEAKING, STANDBY.

the product literally speaks — click to hear it

The LLM can phrase it warmly — but it can never invent a number.
the rule the assistant can't break

a living console

A graph that behaves like a real security console.

Eight kinds of live event — threats, escalations, cross-platform correlations, new identities, remediations and more — are generated from the real data and surfaced the way a real SOC surfaces alerts: colour-coded toasts, an activity feed, on-graph pulses, and a camera fly-in on critical alerts. Clicking any alert flies you to the node.

A Monitoring toggle and a Simulate button control the tempo, so the viewer can choose between a calm demo and a busy one.

Active threat Risk escalation New agent identity Indicator spike Remediation Cross-platform correlation New recommendations Source scan complete
A live threat toast in the top-right, monitoring controls, and the activity feed streaming in the bottom-left.
Toasts, an activity feed, node pulses, and fly-ins — a live SOC feed built from the real data.
v7 dock
The activity feed as a popover in the current bottom command dock.
The same feed, as a dock popover in the current build.

see it work

Ask what's risky. It flies you straight there.

Say “show the riskiest agents” and the graph isolates them. Open one and the detail panel unfolds — risk 79, six indicators across Defender, Entra and Purview. Everything grounded; nothing invented.

step 1
The graph isolating only the highest-risk agents.
1 · Isolate the riskiest agents.
step 2
Filtering the graph by source product.
2 · Filter by source.
step 3
An agent's detail panel showing risk 79 and six indicators across Defender, Entra and Purview.
3 · Open one — risk 79, six indicators across three products.

more views in the current dock

The timeline popover in the bottom dock, scrubbing the estate's risk over time.
Timeline replay, as a dock popover.
An agent's full-height detail panel open in the current dock layout.
The detail panel in the current dock layout.

under the hood

Custom canvas physics, a grounded AI, and a real dataset.

Read the technical details

Custom force simulation

A hand-rolled 2D canvas force graph — velocity-Verlet integration with charge repulsion, springs and centring. It sleeps when settled for performance, re-heats on interaction, and pins indicators on a ring so the hub-and-spoke structure stays readable at 450+ nodes.

Grounded hybrid brain

A local engine produces grounded facts (with node ids); an optional, provider-agnostic LLM (GitHub Models / OpenAI / Anthropic) only rephrases them. Keys live server-side as Netlify env vars — never in the browser. Works fully offline with no key.

Real data pipeline

Defender inventory screenshots → OCR (Tesseract) → normalised against known platform/indicator vocabularies → quota-reweighted for a legible risk distribution. Real agents + real Defender indicators; cross-platform indicators are deterministically modelled.

Next.js 16React 19TypeScriptTailwind v4Canvas 2DNetlify

outcomes

What it adds up to.

~0

real agents rendered

0

cross-platform indicators

0

security sources unified

0

iterations in 4 days

three signature capabilities

Timeline replay Voice-commanded operation (RIOS) Live-event SOC feed

skills demonstrated

Product framing Visual + interaction design Front-end engineering Applied AI

validation

It pointed where the org was already heading.

Self-initiated, then validated fast — by the collaborator who framed the problem, then by design and PM leadership.

You can validate and feel it by looking at the graph. These five agents share the same risk factors — now you can see it.

Kristina Hotz

Collaborator · domain expert

Graphs will be a big part of the experience going forward — a way to visualize the relationships between things, rather than just lists and tables.

Kristen Vise

Product Design Manager · Securing AI

Really liked it — very future looking.

Ankur

PM lead · shared in standup

One offhand line in that first review — “a time travel view, like a doppler radar for risk” — became the timeline feature.

arc — Self-initiated prototype → validated by a domain expert → endorsed by design + PM leadership → pulled into the broader roadmap — in about a week.

reflection

What I'd do next.

trade-offs I own

  • Real agents and real Defender indicators; cross-platform indicators, escalation and detail values are modelled — chosen deterministically so they're stable and plausible, but explicitly not claimed as ground truth.
  • Full voice needs Chrome/Edge; other browsers get a typed-command fallback by design.
  • The High/Medium risk counts are reweighted for demo impact, not a measured distribution.

what I'd do next

  • Drive multi-select and path-finding from RIOS voice as first-class commands.
  • Replace modelled cross-platform indicators with a real multi-product feed.
  • Add saved views and shareable deep links to specific agents or filters.
  • A formal accessibility pass on the HUD — contrast, keyboard, reduced-motion.

RIOS: “Standing by, sir.

Thousands of AI agents, each a new risk — turned from an unreadable list into one living graph you can see, question, and operate by voice.

// fact sheet

Stack
Next.js 16 (static export) · React 19 · TypeScript · Tailwind v4 · custom 2D canvas force sim · Netlify
Data
~450 agents from Defender AI Agents (preview) inventory (26,570 total); 28 indicators across Defender (10) / Entra (8) / Purview (7) / Intune (3)
AI
Grounded local engine + optional GitHub Models / OpenAI / Anthropic (rephrase-only); OpenAI TTS with browser fallback
Built
2026-07-16 → 2026-07-19 · 8 iterations (v0–v7)
Live
renan-agent-risk-graph.netlify.app (password-protected)

A self-initiated prototype. It uses real Microsoft Defender agent inventory and real Defender risk indicators; the cross-platform indicators, risk escalation and per-agent detail values are deterministically modelled — never claimed as ground truth.