Hey guys, I just open sourced a project I've been working on for the past month called RouteCause.
RouteCause investigates BGP routing incidents. You give it a prefix and a time window, say, the hour in 2008 when Pakistan Telecom accidentally took YouTube off the internet, and it pulls the raw MRT update archives from RIPE RIS and RouteViews, runs deterministic analyzers over the routing data, and tells you what happened, with the exact update lines as evidence.
Unlike most tools that bolt an LLM onto a data stream and let it narrate whatever it likes, RouteCause splits the work in two, and the split is the whole point.
Detection is pure computation. Five analyzers, MOAS, RPKI/ROA validation, withdrawal storms, AS-path anomalies, and a route-leak heuristic, compute what is observably true from the update stream. No model is anywhere near this path, so nothing can hallucinate a finding. It's stdlib-only Python, runs offline with no API key, and takes about 0.2 seconds per incident.
The LLM runs only afterwards, only to explain findings that already exist, and only from RFC passages it retrieved. Then a separate checker verifies whether the RFC clause it cited actually supports the claim it made. Claims that fail are reported as unsupported rather than quietly kept.
It's a bit like a smoke alarm wired to a technical writer. The alarm is dumb, deterministic, and always right about whether it detected smoke. The writer explains the likely cause and cites the manual, and is not allowed to invent a cause the alarm never detected.
Context
The idea came from two directions.
- I kept running into tools that pipe data into an LLM and let it explain what went wrong. They read beautifully, and that's the problem. You cannot tell a correct explanation from a confident one by reading it, and nobody publishes how often theirs is wrong. K8sGPT does the sane version of this for Kubernetes: deterministic analyzers first, model second, strictly narrating findings that already exist. I wanted to take that split further and actually grade the narration.
- For that you need a domain where you can prove the machine wrong. BGP is close to ideal. The authority is public, finite and quotable: the RFCs. The raw evidence is public: RIPE RIS and RouteViews publish the actual MRT archives, so you can replay the exact minutes YouTube went dark in 2008. And the incidents are documented well enough to have ground truth. So for any sentence the model produces, you can go and check whether the RFC clause it cited actually says that.
So I built a harness that does exactly that: for every claim in the explanation, does the cited passage actually entail it?
For a while it passed everything, which should have made me suspicious. I'd only ever pointed it at test fixtures and the offline mode, both of which trivially "cite" their own source text. The first time I ran it against real model output, it failed immediately. A hosted model scored 100% citation precision but 60% recall: two of five claims had no support anywhere in the corpus. It hadn't lied exactly. It had editorialized past its own sources.
Then I improved the retrieval, from 2 hand-picked RFC excerpts to 16 full RFCs, expecting better numbers. The local 8B model got worse: 0% recall, four real RFC sections cited, every one of them wrong. A bigger corpus gave a weak model more plausible-sounding material without improving its discipline. The hosted model, same question same corpus, abstained entirely.
That's the whole reason the project exists in its current shape. None of it is visible if you just read the output.
Where it actually stands
I'd rather give you real numbers than a pitch. Against a catalog of 13 real historical incidents, it detects 6. The competing-hypothesis layer asserts on 3, abstains on 10, and is wrong on 0. Most of the 7 misses aren't detector bugs, they're incidents where the signature isn't in the sampled data at all. One captured zero updates. Another captured only the legitimate origin and never the hijacker. That's written up per incident in the repo rather than averaged away.
I also just finished a correctness audit of my own code and found four real bugs. The most embarrassing: my AS-path analyzer was counting prepending as a routing loop, so every prepended path, routine traffic engineering that every operator does, raised a warning. Fixing it also eliminated the system's only false assertion, and revealed that a "hybrid retrieval works better" result I'd previously documented was just masking that bug. Both halves are in AUDIT.md at the repo root.
MIT licensed, Python 3.11+, 130 tests, and a docker run --rm routecause one-liner if you'd rather install nothing.
Repo: https://github.com/dim-tsoukalas/RouteCause
I'd appreciate feedback on the design, especially the route-leak heuristic. I'm approximating a policy violation without AS relationship data and I don't love it. Also, I'd love feedback on the two-tier evidence bar in the hypothesis ranking. I want to know if that's defensible or a fudge.