An architecture description contains several views produced from different viewpoints. ISO/IEC 42010 asks you to record "correspondences", "correspondence rules", and architecture rationale. What are these, and what problem do they solve?
answer
- views drift → silent, jointly-impossible contradictions
- correspondence = recorded relation; rule = constraint that must hold
- record KNOWN inconsistencies instead of hiding them
- rationale = decision + rejected alternatives + assumptions + trace to concerns
- ADRs immutable: superseded, not edited
basics
~20 sCorrespondences are recorded relationships between elements in different views; correspondence rules are constraints those relationships must satisfy. Together they stop multi-view descriptions from silently contradicting each other. Rationale records why decisions were made, including rejected alternatives.
solid answer
~50 sMultiple views describe one system from different angles, so they can drift apart and contradict each other — a component in the functional view that appears on no deployment node, or an externally reachable interface with no authentication mechanism. ISO/IEC 42010 addresses this with **correspondences**: explicitly recorded relations between architecture description elements — across models, views, or even other architecture descriptions. A **correspondence rule** is a constraint governing such relations ("every functional element is allocated to at least one node"; "every data store holding PII carries a residency region"). The standard requires the description to record its correspondences and rules and to state any **known inconsistencies** rather than conceal them, which converts hidden defects into managed ones. Separately, the standard provides for recording **architecture decisions** and **rationale** — the alternatives considered, the justification for the choice, and traceability back to the concerns and stakeholders that drove it. Rationale is the content that ages best: structure is recoverable from the code, reasoning is not.
code
yaml · 32 linescorrespondenceRules:
- id: CR-1
rule: "every functional element is allocated to >=1 deployment node"
between: [functional-view, deployment-view]
check: automated # models are machine-readable
- id: CR-2
rule: "every store holding data classified PII declares a residency region"
between: [information-view, deployment-view]
check: automated
- id: CR-3
rule: "every externally reachable interface declares an authn mechanism"
between: [context-view, functional-view]
check: review
knownInconsistencies:
- views: [deployment-view, operational-view]
description: "deployment shows single region; operational run-book assumes
the post-cutover two-region failover procedure"
owner: platform-lead
resolveBy: "EU cutover, ADR-052"
# rationale lives next to it and outlives the diagrams
decisions:
- id: ADR-052
concern: eu-data-residency # traces back to a stakeholder concern
decision: "active/passive EU region, EU writes pinned to eu-central"
rejected:
- "single global cluster: fails residency constraint"
- "active/active: measured cross-region write latency 140 ms p99"
assumption: "EU write volume < 15% of total"
revisitWhen: "EU write share > 30% or regulator mandates active/active"
status: acceptedgo deeper
Say that different views must agree with each other and that the reasons behind decisions should be written down, including options that were rejected. One concrete rule such as "everything in the functional view must run somewhere" is enough.
Define correspondence and correspondence rule, give two or three concrete rules and the defects they catch, and explain why rationale outlives diagrams.
Add the known-inconsistency clause and why it is honest rather than sloppy, the spectrum from prose to machine-checked rules to generation-by-construction, and ADR practice with alternatives, assumptions, status, and revisit triggers.
Discuss governance and scale: which few rules are worth automating, correspondences across separate architecture descriptions for system-of-systems and enterprise alignment, immutability and supersession of decision records, avoiding traceability overreach, and how much formality regulated or safety-critical contexts justify.
## The problem: many views, one system As soon as you have more than one view, you have a consistency problem. Each view is written by different people, at different times, for different stakeholders. They describe **one** system, so they must agree — but nothing in a pile of diagrams enforces that. Typical silent contradictions: - A functional element exists in the functional view but is allocated to no node in the deployment view (where does it run?). - The information view says a data store holds personal data; the deployment view puts that store in a region the compliance concern forbids. - The operational view describes a rolling upgrade that the concurrency view's shared-state design cannot survive. - An interface marked external in one model has no authentication mechanism recorded anywhere. Each of these is a real defect discovered late and expensively. Multi-view descriptions do not fail because a view is wrong; they fail because two views are individually plausible and jointly impossible. ## Correspondences A **correspondence** in ISO/IEC 42010 is an explicitly recorded relation between architecture description elements. It is deliberately general: it can link elements *within* one model, *between* models in one view, *between* views, or even between separate architecture descriptions (useful for a system-of-systems, or between an enterprise architecture and a system architecture). Common relation types include: - **allocation / realization** — functional element → node, logical entity → physical store, - **refinement** — a coarse element in an overview → its decomposition in a detailed model, - **composition / aggregation** — element is part of another, - **traceability** — decision → concern → stakeholder; requirement → element, - **consistency / equivalence** — the same real thing appearing under two names in two views. The practical payoff of naming them is that reviewers gain a checklist, and tooling gains something to verify. ## Correspondence rules A **correspondence rule** is a constraint that governs correspondences — a statement that must hold across views for the description to be well-formed. Examples worth actually adopting: - Every functional element appears on at least one deployment node. - Every node in the deployment view hosts at least one functional element (otherwise, why does it exist?). - Every data store in the information view has an owner, a classification, a retention rule, and a location. - Every externally reachable interface in the context view has a recorded authentication and authorization mechanism. - Every process/thread in the concurrency view is realized by some functional element. - Every element that a quality scenario names exists in some view. Rules can be checked by humans at review, or automatically when models are machine-readable (architecture description languages, structured YAML/JSON models, or code-level tools such as dependency and modularity checkers that enforce a documented module structure). The strongest form is generating a view from the same source of truth as the system itself, so the correspondence is true by construction rather than by inspection. ## Known inconsistencies — the honesty clause The standard explicitly asks that an architecture description **record known inconsistencies** among its views. This is unusual and important. Real projects have periods where views disagree — mid-migration, mid-refactor, or where two teams have not converged. The choice is not between consistent and inconsistent; it is between *known* and *unknown* inconsistency. Writing "the deployment view still shows the pre-migration single-region topology; multi-region is described in ADR-052 and will be reflected after cutover" converts a trap into a managed item with an owner. ## Architecture decisions and rationale Alongside consistency, the standard provides for capturing **architecture decisions** and **architecture rationale**: the reasoning for a choice, the **alternatives considered and rejected**, the assumptions, and traceability from decisions back to the **concerns** and **stakeholders** that motivated them. In practice this is what an architecture decision record (ADR) captures: context, decision, alternatives, consequences, status, and ideally a revisit trigger. Why it matters more than the diagrams: - **Structure is recoverable; reasoning is not.** In five years a competent engineer can read the code and reconstruct the module structure. Nobody can reconstruct why the team rejected the obvious-looking alternative, or which regulatory clause forced an awkward boundary. - **It prevents re-litigation.** Without recorded rationale, the same debate recurs every time the team composition changes. - **It prevents dangerous "cleanups".** An odd-looking indirection with no recorded reason gets removed by a well-meaning engineer; one with a recorded reason and a revisit trigger does not. - **It supports change.** A decision recorded with its *assumptions* can be re-evaluated when an assumption expires ("we chose single-region because no EU customers; we now have EU customers"). ## Trade-offs and edge cases - **Cost.** Exhaustive correspondence recording is expensive and rots like anything else. Adopt a handful of high-value rules — the ones whose violation causes real incidents — rather than a formal complete mapping. - **Formality spectrum.** Ranges from prose statements, to tables, to machine-checked model constraints in an architecture description language, to generation from a single source of truth. Pick the level the risk justifies; regulated or safety-critical contexts justify far more. - **Rationale bloat.** An ADR per trivial decision buries the important ones. Reserve them for decisions that are costly to reverse, cross team boundaries, or resolve a stakeholder conflict. - **Stale rationale.** ADRs should be **immutable with status transitions** (proposed → accepted → superseded by ADR-N) rather than edited in place; editing destroys the history that gives them value. - **Traceability overreach.** Full bidirectional traceability from every requirement to every element is a classic heavyweight-process failure; trace the *significant* decisions to the *prioritized* concerns and stop there. - **Beyond one system.** Correspondences across architecture descriptions are how a system architecture is kept aligned with an enterprise or product-line architecture — the same mechanism, one level up.
- Give two correspondence rules worth enforcing automatically, and say what defect each catches."Every functional element is allocated to at least one deployment node" catches elements nobody has decided how to run — a classic gap discovered during the first production deployment. "Every data store classified as holding personal data declares a residency region and an encryption-at-rest mechanism" catches compliance violations while they are still cheap to fix, long before an audit. Both are checkable whenever the views are stored as structured, machine-readable models rather than as pictures.
- Why does ISO/IEC 42010 ask you to record *known* inconsistencies rather than requiring the description to be consistent?Because real systems and their descriptions are in flux — mid-migration, mid-refactor, or waiting on a decision — and mandating perfect consistency would either be ignored or would force teams to hide divergence. A recorded inconsistency with an owner and a resolution trigger is a managed item; an unrecorded one is a trap that a reader discovers by making a wrong decision. It is the same reasoning behind tracking known defects rather than claiming there are none.
- Why is rationale often more valuable to future maintainers than the diagrams?Because structure is recoverable and reasoning is not. A competent engineer can reconstruct module structure and deployment topology from the code and the infrastructure definitions, but cannot reconstruct which alternatives were rejected, what assumptions held at the time, or which regulatory or contractual clause forced an awkward boundary. Missing rationale causes two specific failures: the same debate is re-litigated whenever the team changes, and an odd-looking but load-bearing decision gets "cleaned up" by someone who cannot see why it exists.
On a building project the electrical, structural, and plumbing drawings are checked against one another for clashes — a duct routed straight through a load-bearing beam is individually reasonable on each sheet and impossible in the building. Correspondence rules are the clash-detection pass; rationale is the engineer's note explaining why the beam is oversized, so nobody value-engineers it away later.
saying these in an interview costs you the question
- Assuming multiple views are consistent because each one was reviewed individually — contradictions live between views, not inside them.
- Hiding or ignoring divergence instead of recording known inconsistencies with an owner and a resolution trigger.
- Attempting exhaustive, formal traceability from every requirement to every element, which collapses under its own weight.
- Recording only the chosen option and omitting rejected alternatives and assumptions, which is exactly the content that cannot be reconstructed later.
- Editing decision records in place instead of superseding them, destroying the history that gives them value.
- Writing an ADR for every trivial choice so the significant ones become unfindable.
- Treating correspondences as documentation bookkeeping rather than as clash detection that prevents real incidents.