DDD mapper
The DDD mapper holds the catalog and the two landscapes at the same time, and computes the difference.
The requirement that defines it: it must be able to disagree with you.
Anything that only renders the boundaries somebody typed in is a drawing program with domain vocabulary, and there are plenty of those. The mapper earns its place by holding intent and reality together — so its interesting output is never the map, it is the list of edges the map got wrong.
What it reads
Section titled “What it reads”The catalog. Subdomains with their classification, bounded contexts with their language, aggregates, owner and declared realisations. Held as data — version-controlled, reviewable, diffable. Not a wiki.
The declared relationships. The context map: upstream, downstream, pattern, what crosses, and why that pattern.
Observed integrations. From the landscape collector, each with the evidence that produced it.
What it computes
Section titled “What it computes”For every edge in either map, one of the four verdicts:
Matches — an observed integration realises a declared relationship in the way the pattern requires.
Drifts — it realises it badly. This is the interesting computation, because it needs the pattern’s rules, not just the presence of an edge:
| Pattern | Drifts when |
|---|---|
| Anticorruption layer | The upstream vocabulary appears downstream of the layer, or the layer is bypassed. |
| Open host service | A consumer uses a bespoke endpoint rather than the published one. |
| Published language | Payloads on the wire carry fields the registered schema does not declare. |
| Conformist | The upstream model has leaked past the boundary into a core context. |
| Shared kernel | The two sides are reconciling rather than sharing — a nightly match is not a kernel. |
| Separate ways | Any integration at all. |
Unmapped — an observed integration with no relationship behind it. Flagged as a modelling question, never auto-resolved by adding an arrow.
Unobserved — a declared relationship with nothing behind it. Reported with both possible causes named, because they have different owners.
What it emits
Section titled “What it emits”A context map, generated from the relationship data. Never hand-drawn, so it cannot drift from the catalog.
A system map, generated from the observations, with the evidence attached to each edge.
A conformance table, with an owner against every finding and a business consequence rather than a mechanism.
A number — how many declared relationships are implemented as declared — published where people see it, with unobserved counted against it rather than ignored. See conformance on why that rule is not negotiable.
Alerts on change, and the useful one is two systems started talking this week and nobody declared it. That is a boundary decision being made by default, and it is much cheaper to have the conversation before anything depends on it.
Design decisions worth stating
Section titled “Design decisions worth stating”The catalog is the input, not the database. Contexts, relationships and classifications live in version control alongside the code they describe. The mapper reads them. A modelling decision then arrives as a reviewable change with an author and a rationale, rather than as an edit somebody made to a web form at some point.
Evidence is required, and its absence is a value. An integration with no observation is not an integration. A context with no observation is unobserved, not aligned.
Findings carry a business consequence. The mapper can derive the mechanism; the consequence has to be written by a person. An entry without one is incomplete, and it should look incomplete.
It has no opinion about architecture. Whether contexts should be microservices, whether events should be sourced, whether the strangler should finish this year — none of that is here. It reports whether the estate implements the model that was agreed. What to do about it belongs to arch-hub.
Status
Section titled “Status”Designed, not built. The tools page lists it as planned along with what it reads and emits.
The seed data on the landscapes page is a worked example of exactly what it would produce, computed by hand. That is deliberate: doing one pass manually is how you find out whether the automated version is worth building, and for an estate this size the answer takes an afternoon.