Architecture Decision Records (ADRs)
Records of significant architectural decisions in the Microservice Dungeon, and how to create new ones.
This section contains all Architecture Decision Records made within the project. To create a new one, copy the
ADR template and name it NNNN-kebab-title.md.
Architectural Significance
How do we decide on which decisions we need to capture in an Architectural Decision Record (ADR)?
O. Zimmermann wrote an article proposing the following guiding principles:
- The requirement is directly associated with high business value (benefit vs. cost) or business risk.
- The requirement is a concern of a particularly important stakeholder such as the project sponsor or an external compliance auditor.
- The requirement includes runtime Quality-of-Service (QoS) characteristics (such as performance needs) that deviate from those already
satisfied by the evolving architecture substantially.
- The requirement causes new or deals with one or more existing external dependencies that might have unpredictable, unreliable and/or
uncontrollable behavior.
- The requirement has a cross-cutting nature and therefore affects multiple parts of the system and their interactions; it may even have
system-wide impact, short term and/or in the long run (examples: security, monitoring).
- The requirement has a First-of-a-Kind (FOAK) character: For instance, this team has never built a component or
subsystem that satisfies this particular requirement before.
- The requirement has been troublesome and caused critical situations, budget overruns or client dissatisfaction on a previous project
in a similar context.
Translating that to our case is a bit tricky but works for a lot of things:
- The decision is directly associated with goals relating to the project’s success
(student and professional workshops, demonstrators, development projects). E.g.: How do we document and publish the API for our core services?
- The particularly important stakeholder is only partly relevant.
- QoS characteristics are also mostly arbitrary, but play an important role for the local dev env and when actually scaling out.
- The decision introduces or deals with external dependencies - these are mostly in the form of code libraries and tooling. E.g. Which tools do we use to deploy our infrastructure? (Terraform, Ansible, Puppet, Chef, etc.)
As in our case, external dependencies also mean knowledge that has to be acquired in order to maintain the system.
- The decision has a cross-cutting nature and therefore affects multiple parts of the system and their interactions; it may even have
system-wide impact, short term and/or in the long run (examples: security, monitoring, event formats, tooling).
- FOAK is quite common in our case, as a lot of this is new to some of us. Nevertheless, an important indicator.
- The decision has been troublesome and caused intensive discussions before.
Records
Template for new architecture decision records. Copy it, rename it to NNNN-kebab-title.md and replace every placeholder.
Why architecture decisions are recorded as short Markdown ADRs in the documentation site, based on a slimmed-down MADR.
Why players control their robots and trade by publishing intent events to Kafka instead of calling REST endpoints.
Who defines intent schemas, and why intents are published on one topic per aggregate to keep their order.
Why players are trusted not to spoof each other’s intents, how the code of conduct covers this, and how zero trust could be added later.
Naming conventions for Kafka topics and event types, and the standard headers every event carries.
Why core services publish both business (delta) events and state-transfer (ECST) events, and how players should use them.
Why consumers of the core services detect duplicates by storing what they have processed, instead of relying on idempotent business logic.
Why core services publish events through a transactional outbox and a per-service outbox-service, giving at-least-once, in-order delivery.
Last modified October 22, 2026:
Update documentation (f481966)