The alert is never where the bug is.
Retrying every 5 s. The recorded incidents still play.
Live health · last 8s
Agent steps
Waiting for the alert.
The agent's report
Recordings of real runs against the demo stack. The Live tab reads the graph on FalkorDB Cloud.
How it works
The service that alerts is rarely the one that is broken, and a deploy only matters if it is on the failing path. Each step is a graph query.
Find where it starts
Walk the call graph down from the alerting service. The deepest unhealthy service with healthy dependencies is the origin. Changes outside that subgraph are ruled out.
MATCH p = (s:Service {name: $alerting})-[:CALLS*0..6]->(d:Service) RETURN d.name, min(length(p)) AS hops // a flag reaches services it was never deployed to MATCH (x:FlagChange)-[:TOGGLED]->(:Flag)-[:AFFECTS]->(d:Service) WHERE d.name IN $candidates AND x.at >= $since RETURN d.name, x
Check logs and memory
Read the logs of that one service, and find past incidents with the same cause and what fixed them.
CALL db.idx.fulltext.queryNodes('Incident', 'checkout|timeout|fraud') YIELD node, score MATCH (i:Incident) WHERE i.id IN $ids OPTIONAL MATCH (i)-[:ROOT_CAUSE]->(rc) OPTIONAL MATCH (i)-[:RESOLVED_BY]->(a:Action) RETURN i, collect(rc), collect(a)
Act, dry run first
Roll back, restart or turn off a flag. A hook refuses any real action that has no matching dry run in the graph.
MATCH (a:Action {kind: $kind, target: $target, dry_run: true}) WHERE a.at >= $fifteen_minutes_ago RETURN count(a)
Verify
Wait until the alerting service is healthy twice in a row. If it is not, rank again.
verify_recovery(frontend) t=4s degraded error 6.7% t=7s healthy error 0.0% p95 112 ms t=10s healthy error 0.0% p95 110 ms recovered
Page and remember
Page whoever is on call, and store the incident with a ROOT_CAUSE edge to the change that caused it.
MATCH (t:Team)-[:OWNS]->(:Service {name: $s}) OPTIONAL MATCH (p:Person)-[:ON_CALL_FOR]->(t) RETURN t.name, p.handle (:Incident)-[:ROOT_CAUSE]->(:Change)-[:CHANGED]->(:Service)
With and without the graph
Six injected failures, the same agent and the same remediation tools. Baseline gets only health, logs and a flat list of changes.
Install
The MCP server is a local process your agent starts. There is no Rootpath server.
Local Docker or FalkorDB Cloud. Topology, changes, incidents and agent steps all live there.
A hosted graph per workspace, a remote MCP endpoint, and webhooks for deploys and alerts.
The graph
The agent reads it with read-only queries. Only validated tools write to it.
// topology and ownership (:Team)-[:OWNS]->(:Service)-[:CALLS]->(:Service) (:Person)-[:ON_CALL_FOR]->(:Team)-[:ESCALATES_TO]->(:Team) (:Runbook)-[:FOR]->(:Service) (:Flag)-[:AFFECTS]->(:Service) // what changed (:Change:Deploy)-[:CHANGED]->(:Service) (:Change:FlagChange)-[:TOGGLED]->(:Flag) (:Deploy)-[:ROLLED_BACK]->(:Deploy) // incident memory (:Incident)-[:IMPACTED]->(:Service) (:Incident)-[:ROOT_CAUSE]->(:Change | :Service) (:Incident)-[:RESOLVED_BY]->(:Action)-[:BECAUSE]->(:Evidence) (:Investigation)-[:STEP {n, tool}]->(any node the agent read)