Skip to content
bredwood.com
← All posts
4 min readbredwood

Your Architecture Diagram Is Already Wrong

A diagram is a snapshot with no mechanism to keep itself true. The durable asset is the maintained model, and the picture is only a view of it.

A diagram is a snapshot

An architecture diagram is a claim about a system at a moment in time. It was accurate when it was drawn, or accurate enough. The problem is not accuracy. The problem is that nothing about a drawing keeps it true. It has no inputs, no update mechanism, and no failure signal. When the system changes, the diagram does not change with it, and nothing tells you it has fallen behind.

Most teams already know their diagrams are stale. What they underestimate is how quickly and how quietly that happens. A diagram drawn at the start of a large migration is wrong by the end of it. A diagram drawn after an incident is wrong the next time on-call makes a judgement call under pressure. The drift is not dramatic. It accumulates at the pace of ordinary change.

What a picture cannot do

A diagram has no notion of identity. It shows a box labelled something like Orders Service or, worse, DB. It does not know whether that box and the pod running in your cluster are the same thing, because there is no link between the drawing and the system. Every question you actually care about requires that link.

Consider the four questions engineers ask most often.

  • What breaks if I change this? A diagram cannot answer this. It shows adjacency, not dependency direction, not whether an edge is synchronous or asynchronous, and not whether the consumer degrades gracefully.
  • Who owns this? A diagram may show a team name in a box, but it has no relationship to a code owner file, a service catalogue entry, or an on-call rotation. It cannot be queried, so it cannot be current.
  • Has this changed? A diagram cannot detect anything, because it has nothing to compare against. Detecting drift requires a model with inputs.
  • How do I get started here? A diagram can show someone a shape, but onboarding needs a path: which service do I run first, what depends on it, what data does it need to be useful locally.

Picture of the system versus model of the system

The distinction is not visual. A model can be rendered as a diagram, and often should be. The difference is that a model is a data structure with identity, attributes, and relationships, maintained independently of any rendering. The diagram becomes a view, one of several, generated from the model rather than maintained alongside it.

That structural difference is what makes the maintenance economics work. With a diagram, every change requires a human to remember and redraw. With a model, a change flows in from a source that already knows about it. The model is not maintained by hand any more than a type checker is maintained by hand.

A minimal model entry for a single service looks like this.

{
  "service": "checkout-api",
  "owner": "payments-platform",
  "depends_on": ["postgres-primary", "payments-gateway"],
  "exposes": ["POST /checkout"]
}

It is unremarkable, and that is the point. Ownership is a field that can be looked up. Dependencies are a list that can be traversed. The view you render tomorrow is a function of the data, not a second artefact someone has to keep in step.

What becomes possible when the system is a model

Once the system is queryable, work that used to be manual becomes mechanical.

Impact analysis becomes a traversal. You ask which services transitively depend on the one you are about to change, and you get a list with owners attached. The same traversal, run the other way, gives you the blast radius of a dependency failing. These are the same question asked in two directions, and both are cheap when the graph exists.

Drift detection becomes a comparison. You compare the model against what is deployed, and you surface differences instead of hoping someone notices. Reconciliation stops being an act of discipline and becomes a scheduled job.

Onboarding becomes a route instead of a reading list. A new engineer can start from the service they own, walk its dependencies outward, and see which team to ask. Knowledge that used to be transferred in hallway conversations becomes something you can look up.

Change review becomes grounded. A reviewer can see what a pull request touches at the architectural level, not just the file level. A change to a shared module stops looking like a small diff.

Keeping the view honest

The argument for a maintained model is not that pictures are useless. It is that a picture is an output, and outputs should be derived. When the diagram is generated from a model that has real inputs and reconciliation against deployment, the diagram is either current or visibly wrong.

Either state is better than the one most teams live in, where the diagram is confidently and undetectably out of date.

architecture-driftarchitecture-as-codedependency-graphs