Article

We built Architect for humans. Agents made it transformative.

Explore the engine behind Adyen's platform brain. Processing up to 7 million traces per second using Kafka, Apache Flink, and Neo4j, Architect unites our runtime, compile-time, and infrastructure data. Learn how this foundational graph turns AI into a genuine reasoning partner.

Mat Jones, Omar Hommos & Micaela Stump
August 23rd, 2026
 ·  8 minutes
Blog header for Platform Engineering & AI showing an AI star icon on a gradient background

It's 3am. An engineer gets paged. A service is throwing errors, and the first question is always…

What actually depends on this thing?

(Ok, maybe the second question, after "Oh no, what's happening?")

Answering it used to kick off forty-five minutes of tab-juggling… traces in one window… the repo in another… a bit of Slack archaeology… and an architecture diagram that was last accurate sometime around the previous reorg. (Or, failing all that, trying to wake up the person who actually knows.)

We built Architect to make that question answerable. The goal was simple enough: a near real-time, queryable map of how our platform actually fits together, stitched from three graphs:

  • A code graph of roughly 250,000 classes across 6,000+ modules.

  • A service graph of around 3,000 live services and the ~470,000 calls between them.

  • An infrastructure graph of tens of thousands of hosts spread across tens of data centres.

It turns out no single person can hold all of that in their head. (And extracting the brains from multiple engineers' heads was apparently frowned upon).

Then we gave our agents the same map, the same factual foundation, and the forty-five minutes became a few seconds.That second part is the one we didn't fully see coming. It's also what this post is about.

Architect is built to become Adyen's living brain for agents and humans, and it's only finishing elementary school.

Observed architecture beats imagined architecture

Most workflows (for both agents and humans) share the same failure mode: they’re guessing. Interpreting. Reconstructing the platform from partial context and a hopeful vibe, burning tokens (or brainpower) the entire time.

Before Architect, if you wanted an agent to answer a real question about the platform, it first had to read the platform. Raw source across every repo, raw logs, the lot. We tried it. Our monorepo alone runs to hundreds of thousands of files, and it's far from the only one. Production generates up to 7 million tracing spans per second, so "just feed it the context" turned into hundreds of millions of tokens before we admitted there had to be a better way.

You might instead decide to read architecture diagrams. These are usually correct in spirit and approximate in detail. That is not a criticism. It is just what happens when systems evolve quickly, teams move fast, and reality keeps contributing fresh material.

Architect is that better approach.

Instead of relying on static diagrams or manual mappings, it continuously builds an understanding of how the platform behaves and how its code is structured. That gives engineers a living model rather than a one-time sketch.

It gives agents a factual substrate: pre-computed, verified, and queryable. If it exists in the graph, it is happening. No interpretation. No hallucination. No "based on the code I've seen so far." This also reflects practical reality, not perceived reality from design docs or expired assumptions.

A single graph query returns what would otherwise be thousands of lines of context the agent has to read, hold in memory, and hope it reads correctly. One query. And it's true.

Now we can answer questions that used to take an afternoon:

  • "Is this runtime dependency actually referenced in the code, or can we drop it?"

  • "There's a monkey loose in the data centre unplugging racks. Which critical flows go down, and what do we shift where?"

  • "Can we modularise this service without quietly breaking a production caller?"

Those are cognitively expensive questions for a human. You're holding three datasets in your head and joining them by hand, on a good day, correctly. (Again: still not allowed to extract everyone's brains, apparently.) An agent doesn't care. It's joined all three before you've finished reading the question.

Three graphs, one agent conversation

Architect connects three domains that normally live in three different tools, owned by three different teams, described by three different mental models:

  • Runtime: what's happening in production right now. Which services call which, where pressure is building, whether we stay standing when something falls over.

  • Compile-time: how the code is actually put together. How coupled things are, the blast radius of a change, which dependencies are load-bearing and which are just… there.

  • Infrastructure: where workloads physically run, how compute is spread, and what happens if we lose a rack or an entire data centre.

We then have the ability to bridge all this of these by using a composite database (thanks Neo4j for this feature, super useful)

Diagram of a network with agents connecting to an MCX server, which interacts with a compose site managing runtime, code, and infrastructure.

And having three graphs we can connect is cool and all… but I know what you’re thinking (especially if you’re an engineer)…

What’s under the hood

Alright, time to get semi-technical. We’ll dive deeper into each of these in future posts (because each of them is actually pretty interesting).

But to give some teasers… our ingestion looks like this.

Diagram showing data flow from workloads through Kafka, Git, and facts to a Neo4j Graph Database.

So what are we looking at?

Let’s start at the top… which is our runtime data.

It's traces. Yep, that's genuinely it.

All our workloads in all of our environments are constantly emitting trace data, which is being fed to Kafka, and a consumer is picking it up.

Now, our “super secret ingestion pipeline” is… Apache Flink.

Flink itself is picking up every single trace emitted (7m per second), and going through a pipeline, where we do some filtering, internal-app correlation (this webapp is calling that webapp… but why), cross-app correlation (just a bunch of linking seemingly disjointed spans), extraction, aggregation, and writing.

Diagram of data flow in an API processing system with components for source, transformation, and execution stages.

A bit of a high level overview on what our Flink pipeline looks like, there’s a bunch more we split out based on the other components, but that’s pretty much it!

Here's a sneak peak of an actual application of the Runtime Graph: a regional health monitor UI which analyzes cross-region traffic. Here we’re analyzing a badly behaving dummy app for dramatic effect.

So, yeah… don’t worry, this isn’t real data getting passed around.

Global map showing payment transaction routes managed by Adyen, with various colored dots and lines representing data flow.

And the middle… our code graph.

Alright, this one is slightly more complicated.

We have a Java monorepository, and that main repository has a lot of files… and building the whole thing from scratch annoys our DevEx team as I hog all the runners. Meaning we had to do something different.

We used Flink again.

I mean it worked the first time and this isn’t the definition of insanity, right?

What we focused on here was incremental builds. We tried full builds every 4 hours, which eventually became very painful.

Inside Flink, our source reader is actually a git poller, inside a rather large TaskManager container with a cloned repository, fully built. Then the poller starts polling. Any time the head ref changes, we pull, kick off an incremental build (so only the changed files are rebuilt), split them into their types (each with a reference to its source file), parse and enrich them, then write.

Diagram illustrating data flow from a remote branch to payment processing using Adyen technical components.

Same same, but different. Again, a nice anonymized view of the actual UI. You can see a nice summary of the state of our codebase, along with different applications for this graph in the sidebar.

Dashboard screenshot showing API analytics and code graph filters on a business analytics platform.

Now to the bottom… our infra graph.

We have a comprehensive Facts database that continuously captures ~900 metadata items from every bare-metal or virtualized host in our fleet. This includes server specification, OS and kernel configs, networking setup and info, security and access, installed software, runtime hardware detail and much more. We focused on facts relevant for the bigger picture: 

  • The full hierarchical mapping: platform region -> infrastructure region -> availability zones -> data center -> floor -> rack -> physical host -> virtual machine.

  • Function: compute, storage, kubernetes worker, kafka host, etc

  • Meta information: role, environment, owner, first seen, last seen, etc.

Getting this information is simple. No Flink here, just a combination of a builder job, creating the skeleton, and some enrichment jobs to add a couple of other things from different data sources… It's effectively a series of cron jobs.

And as our infrastructure doesn’t change that often, we run this a couple of times per day.

Adyen team members analyzing a digital dashboard with graphs and payment data in an internal office setting.

What all of this means: Reasoning across boundaries

Alright, tech talk over. 

The common thread we see with agents is that the complexity isn’t necessarily searching or retrieving. 

It's reasoning across connected data in a single conversation: runtime, compile-time, and infrastructure at once.

And here's what makes engineers actually trust the answers: they're read-only queries against verified, observed data. The agent isn't generating a plausible-sounding response from training data. It's reading what's true and reasoning from there.

That's a different confidence level. "The graph says so" lands very differently from "the model reckons."

Having this confidence level, this reasoning, and this visibility means the possible implementations of this are endless; from security tabletops, to disaster simulation, to anti-pattern monitoring in code, runtime, infrastructure, to helping our build pipelines understand what really needs to be built and tested, to whatever stuff our resident mad scientists come up with next (we have a few). We haven’t even scratched the surface of what we could possibly do with this. 

And just for your viewing please; here are some example resilience health rules we implemented on composite information. None of it is easy to do from a single graph alone.

Dashboard displaying compliance rules and activity logs for Adyen payment system management.

Finally… What this means if you're an engineer using AI

If your agents don't have grounded context, they're expensive autocomplete.

If they do, they become genuine reasoning partners.

The investment was never really in the AI. It was in giving the AI something true to reason about: a factual substrate that encodes the institutional knowledge which would otherwise take a new engineer (or a new agent) months to absorb.

Architect is not a graph project.

It's the foundation that makes agentic engineering actually work at our scale. ---

This is the first post in a series. Next, we go one domain at a time: how agents use Architect to reason about runtime incidents, untangle compile-time complexity, and make sense of infrastructure resilience.

Fresh insights, straight to your inbox